Разница между использованием mallo c и char array [i] при использовании strorage в функциях - PullRequest
1 голос
/ 20 января 2020

В чем разница между определением массива длины, который определяется до времени выполнения (зависит от аргументов командной строки) с помощью array[size] и использованием malloc()? array[i] приводит к тому, что данные помещаются в стек, malloc() использует кучу [см. Этот стековый поток]

Так что с большими данными я могу столкнуться со стековыми потоками, но на новой машине в общей сложности 30 char с и int с не должны быть проблематичными c ( Стек составляет около 1 МБ на windows в соответствии с этим ).

Так что я, вероятно, упускает что-то очевидное.

Насколько я понимаю, при определении в main() оба должны быть одинаковыми:

Пример 1

int size; // depends on some logic
char array[size];

Пример 2

int size; // depends on some logic
array= (char *)malloc(size * sizeof(char));
free(array); // later after use

Но когда я использую массив внутри функций и передаю его как указатель (func(char* array)) или как массив (funct(char array[])) иногда gdb-debugger дает мне знать, что функция получает поврежденные данные в # 1, используя malloc(), исправила проблему.

Is array[i], не рекомендуется использовать, когда она не определяется при компиляции время? Это какая-то ограниченная проблема? Этот ответ содержит комментарий, предлагающий такую ​​вещь, но я не совсем понимаю, применимо ли это здесь.

Я использую C99.

1 Ответ

0 голосов
/ 20 января 2020

Основное отличие состоит в том, что массивы, объявленные с фиксированным размером, выделяются стеком (а ссылки на него или его элементы действительны только в пределах его области действия), в то время как malloc d массивы выделяются в куче.

Распределение стека означает, что переменные хранятся непосредственно в памяти. Доступ к этой памяти обычно очень быстрый, так как ее распределение выполняется во время компиляции.

С другой стороны, переменным, расположенным в куче , выделяется память во время выполнения и - при обращении к этому память медленнее - единственным ограничением является размер виртуальной памяти.

Посмотрите здесь:

https://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html

...