2015-04-01 3 views
0

Я пытаюсь создать массив слов. В чем разница между созданием массива, как это:Malloc vs автоматическое создание массива

char* myWords[10]; 

и

char* myWords = malloc(10*sizeof(char *)) 

Я предполагаю, что, так как первый один происходит автоматически, что память пожинали в конце выполнения функции. Это верно?

+0

Вы можете выделить стек, используя | char * mywords = _alloca (10 * sizeof (char *)); | , и память автоматически будет освобождена при выходе функции. – rcgldr

ответ

2

Это очень разные типы.

Первый создает массив указателей обычным (автоматическим) способом. 10 указателей действительны до окончания функции. Они не указывают на что-либо, действующее только с этим, но каждый может указывать на отдельную строку, к которой можно получить доступ из каждого элемента массива.

Второй выделяет кусок памяти одному указателю на символ. Таким образом, вы ожидаете, что он укажет на строку (обычно до 40 или 80 байт). Память действительна до тех пор, пока вы ее не освободите, но указатель будет автоматически, как и первый. (Обратите внимание, что массив указателей символов распадается до char **, а не char *.)

0

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

0

Данные malloc распределяются куче, а другая - в стек. Malloc помещает ваши данные в кучу, которую вы должны контролировать самостоятельно. После того, как вы закончите с данными, вы должны освободить данные (проверьте man-страницы на malloc), чтобы у вас не было утечек памяти.

Может быть, этот сайт предоставляет вам более глубокое: http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

+0

Имейте в виду, что все, что связано с кучами и пакетами, не имеет ничего общего с самим C, это обычно как платформа реализует C. – teppic

Смежные вопросы