Подтвердить что ты не робот

Сколько памяти выделяет int x [10]?

Есть ли разница в использовании памяти этих двух строк кода?

int *a = malloc( 10 * sizeof(int) );
int b[10];

Первая строка должна выделить память для 10 целых чисел и 1 указателя. Но я не уверен во втором. Будет ли это также выделять память для 10 ints и 1 указателя, или всего 10 ints?

4b9b3361

Ответ 1

Проще говоря:

int *a = malloc( 10 * sizeof(int) );

Выделяет не менее sizeof(int*) байтов автоматического хранилища для указателя *a. Когда вызывается malloc, для вашей программы будет выделяться не менее sizeof(int) * 10 байт динамического хранилища.

С другой стороны:

int b[10];

Выделяет не менее sizeof(int) * 10 байтов автоматического хранилища. Здесь нет указателей. Когда вы используете имя b в выражении (пример: a = b), оно распадается на указатель. Но a - это указатель, а b - массив. Проверьте это на C FAQ: C-FAQ Раздел. 6: массивы и указатели.

В самом обычном случае "автоматическое хранение" означает "стек", а "динамическое хранилище" означает "куча". Но это не всегда так. Вы можете прочитать несколько обсуждений по этим вопросам в этом вопросе: "Почему термины" автоматический "и" динамический "предпочтительнее терминов" стек "и" куча "в Управление памятью на C++?" .

Ответ 2

В первом случае a сам занимает sizeof(int *) байты автоматического хранилища и указывает на 10 * sizeof(int) байты динамического хранилища.

В последнем случае b занимает 10 * sizeof(int) байты автоматического хранилища. Поскольку b - это массив, указатель отсутствует.

Таким образом, первый случай использует более общие байты, но меньше в стеке (при условии, что стек используется для автоматического хранения).

Если общее количество используемых байтов относительно невелико, автоматическое хранилище обычно отлично. Для больших объемов предпочтение отдается динамическому хранению. Для реализации стека, в частности, слишком большое количество слишком больших автоматических переменных может переполнять стек.