основные о массиве указателей - PullRequest
1 голос
/ 12 февраля 2012

Я пытаюсь объявить массив указателей struct some_struct в C

Могу ли я сделать:

some_struct* arr[10];

вместо:

some_struct** arr=(some_struct**)malloc(10*sizeof(some_struct*));

А в чем разница?

Ответы [ 4 ]

5 голосов
/ 12 февраля 2012
  • Первый помещает массив в стек.
  • Второй размещает его в куче.

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

Во втором случае массив живет за пределамиобласть, где указатель объявлен.Поэтому вам нужно будет вручную free() сделать это позже, чтобы избежать утечки памяти.

1 голос
/ 12 февраля 2012

Первый выделяется в стеке.

  • Его время жизни - это окружающая область, и вам не нужно вручную освобождать память, которую он занимает, так как она будет освобождена, когда закончится окружающая область(говорят, что он имеет автоматическую продолжительность хранения)
  • Подобные массивы времени компиляции должны иметь постоянный размер (то есть размер должен быть известен во время компиляции, а не во время выполнения.Если вы не используете C99, который допускает использование массивов переменной длины (VLA), или компилятор GCC, который имеет нестандартное расширение, позволяющее
  • после их создания изменять их размер
* 1012 невозможно* Секунда выделяется в куче.
  • Срок ее действия - до тех пор, пока вы вручную не освободите ее с помощью free (говорят, что динамическая продолжительность хранения)
  • Если вы не используете free на нем, прежде чем потеряете все указатели на него (в этом случае, пока указатель на него не выйдет из области видимости), у вас будет утечка памяти
  • размер этих массивов может быть определен во время выполнения
  • . Вы можете использовать realloc для указателя на массив, чтобы попросить среду выполнения C попытаться сделать его больше (или меньше) на месте (или переместить его вдругая большая область памяти, если невозможно изменить ее размер)
0 голосов
/ 12 февраля 2012

some_struct* arr[10]; Распределит память в стеке, а some_struct** arr=(some_struct*)malloc(10*sizeof(some_struct*)); выделит ее в куче.

0 голосов
/ 12 февраля 2012

Первый будет выделен в стеке, второй в куче

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...