[c, win] char c[n] против char* c=HeapAlloc(..., n)
я не профи, но есть мысль, что
char c[n];создается на стеке и давать доступ к стеку в другой функции крайне небезопасно.
char c[n] даёт большую нагрузку на стек (велика вероятность схлопотать Stack overflow) при n>~1kb.
э... Это конечно зависит от ОС, но в винде вроде стек порядка 1Мб...
Post deleted by
и?
мне всегда казалось, что размер стека определяет компилятор, а не операционка 

а если эта функция окажется в рекурсии с глубиной эдак в 1000?
то её надо оптимизировать по памяти 

В общем итоговая мысль какая? Использовать массивы только если они меньше X байтов и не участвуют в рекурсии? Тогда для различных операционных систем (или все же компиляторов?) какое примерное X?
В Linux:
8 Мб на весь стек
dsme ~ $ ulimit -s
8192
8 Мб на весь стек
В винде:

$ ulimit -s
unlimited

Эммм, на весь стек - это на все программы одновременно ? 

А по умолчанию сколько? Компиляторозависимо?
У меня на gcc(без опций) объявление ~двухмегабайтного(только для теста) массива крашится, а других компиляторов у меня нет.
У меня на gcc(без опций) объявление ~двухмегабайтного(только для теста) массива крашится, а других компиляторов у меня нет.
Эммм, на весь стек - это на все программы одновременно ?на каждую естессно
этот параметр можно изменять под рутом
Народ вы чо, с ума сошли? Массивы в C перелаются по ссылке, а не по значению.
Если надо передавать по значению — необходимо заворачивать в структуру.
Если надо передавать по значению — необходимо заворачивать в структуру.
А по умолчанию сколько?я бы посоветовал не париться
если пишешь утилиту на скору руку, то юзаешь стековый вариант и не паришься
если пишешь серьезную прогу "на века" то стековый вариант вообще не юзаешь
если пишешь супер отимизированную по скорости прогу - то читай соотв. книжки, статьи, алгоритмы там все есть
Народ вы чо, с ума сошли? Массивы в C перелаются по ссылке, а не по значению.здесь речь не про передачу а про инициализацию
где сам массив в памяти лежит?
где сам массив в памяти лежит?откуда мне это знать?

Если массив локальный для процедуры, то результаты инициализации будут видны только этой локальной процедуре.
Если массив нужен только для внутренних вычислений, то, имхо, лучше его захватывать и освобождать в самой процедуре.
Инициализация отличается только в ассемблерном коде - DEC ESP, N и PUSH N - CALL HeapAlloc
блин
внимательно читай тред сначала
внимательно читай тред сначала
Прочитал несколько раз. То, что хочет топикстартер — непонятно.
Хотя бы примеры привел.
Хотя бы примеры привел.
Функция, в ней локальная переменная - массив, либо динамический либо на стеке. Рекурсия.
нужно передать функции неинициализированный буфер длины nТо есть неявно подразумевается, что этот массив будет потом использоваться в родительской функции.
Про рекурсию не увидел ни слова

Функция, в ней локальная переменная - массив, либо динамический либо на стеке. Рекурсия.В такой постановке все, конечно, зависит от длины массива.
Ну, вот если я на скорую руку пишу рекурсивный поиск на диске (функция принимает два указателя: где ищем и что ищем то париться или нет?
А вообще, когда я вопрос задавал, то у меня была ситуация: объявляем 8-килобайтный массив, содержащий описание ошибки под виндой, передаем его паре функций (отображающих это описание пользователю) и освобождаем память (HeapFree для HeapAlloc или оборачиваем в { } для массива).
Тут как я понял париться не стоит, да?
А вообще, когда я вопрос задавал, то у меня была ситуация: объявляем 8-килобайтный массив, содержащий описание ошибки под виндой, передаем его паре функций (отображающих это описание пользователю) и освобождаем память (HeapFree для HeapAlloc или оборачиваем в { } для массива).
Тут как я понял париться не стоит, да?
То, что хочет топикстартер — непонятно.топикстартер спрашивает в чем отличие
void f {
char c[N];
}
и
void f {
char* c = HeapAlloc(..., N);
}
ответ: в первом случае массив создается в стеке, который довольно маленький и следовательно длина массива не может быть большой
зато работает быстрее
во втором случае создается в куче, длина зависит от кол-ва оперативки
чем отличается стек от кучи читай тут: http://en.wikipedia.org/wiki/Dynamic_memory_allocation
http://en.wikipedia.org/wiki/Stack-based_memory_allocation
char* c=HeapAlloc(..., n)
Здесь явно рассматривается способ создания (размещения) массива, а не способ его передачи.
не поверишь, я отлично знаю, чем отличается стек от кучи 

тогда чего мне голову морочишь что перечитал тред и не понял про что он?
К тому, что по исходному посту автора было непонятно, зачем ему нужен массив в функции:
либо для локальных рассчетов, чтобы из него потом извлечь результат и вернуться в родительскую
процедуру, либо для того, чтобы его инициализировать с тем, чтобы родительская процедура
могла использовать результаты этой инициализации.
либо для локальных рассчетов, чтобы из него потом извлечь результат и вернуться в родительскую
процедуру, либо для того, чтобы его инициализировать с тем, чтобы родительская процедура
могла использовать результаты этой инициализации.
Автору нужно было понять общий принцип, а не получить готовую программу. Так что не надо на меня все валить.
Если я ни слова про что-то (рекурсию) не написал - это вовсе не значит, что я не хочу про это "что-то" получить дополнительные знания
p.s. Загадил мне тут хороший тред
Споря с тобой, мои никто и не заметил 
Если я ни слова про что-то (рекурсию) не написал - это вовсе не значит, что я не хочу про это "что-то" получить дополнительные знания

p.s. Загадил мне тут хороший тред
Споря с тобой, мои никто и не заметил 
Ну, вот если я на скорую руку пишу рекурсивный поиск на диске (функция принимает два указателя: где ищем и что ищем то париться или нет?имхо, поиск на диске не должен быть рекурсивным
а раз ты уже неправильно делаешь, то пох все неправильно или только часть
ну извини, зато будешь выражать свои мысли яснее в следующий раз
Ну, сразу всему же не научишься, так зачем ошибки плодить? Потом меньше переписывать.
А какой нерекурсивный вариант? Побитовое чтение подряд файловой системы?
А какой нерекурсивный вариант? Побитовое чтение подряд файловой системы?
Оставить комментарий
feliks28
Задумался: а вот бывает нужно передать функции неинициализированный буфер длины n для записи в него.Конструкция char c[n]; во первых проще выглядит, во вторых ассемблерный код (и как следствие exe'шник) получается короче. А что происходит при выполнении?
Какая из двух сабжевых конструкций шустрее/стабильнее? Они отличаются вообще?