2013-09-30 2 views
5

Допустим, я что-то вроде:Где выделена память при создании этого массива? (C)

char* test[] = {"foo","bar","car"}; 

Что именно это равносильно, если бы я сделал это длинный путь? Это автоматически создает память, которую мне нужно будет освободить? Я просто смущен. Благодарю.

+2

Хорошее эмпирическое правило состоит в том, что вам нужна только свободная память a), которую вы создаете (например, с помощью 'malloc' или' mmap') или b), которая возвращается функцией, которая ** явно документирует * * что вы несете ответственность за это. –

ответ

2

test представляет собой массив указателей на Чар, расположенных в стеке, и строковые литералы "foo", "bar", "car" хранятся в только для чтения места. Вам нужно ничего не освобождать.

test[0], test[1], test[2] Указывает на данные только для чтения. Прочитайте о правилах определения и времени жизни переменной в C. По умолчанию переменная, которая не имеет спецификатора класса хранения в блоке, имеет спецификатор класса хранения auto, что означает переменную с локальным временем жизни.

{ 
    char* test[] = {"foo","bar","car"}; 
} 
//cannot access test here 
test [0] = "new"; // Compile time error - ‘test’ undeclared 

При попытке изменить "бар" в "тар" даст ошибку во время выполнения:

char* test[] = {"foo","bar","car"}; 
test[1][0] = "tar"; // Run-time error 

Однако это хорошо test[0] начинает указывать на "new" от "foo":

test [0] ="new"; 

Ссылка на "foo" потеряна.

+0

Значит, я не могу изменить эти значения, если они доступны только для чтения? Не могу ли я сказать тест [0] = "foo2"? – zProgrammer

+0

Строковые литералы хранятся в местах, недоступных для чтения, а не в самом указателе. Указатель имеет локальное время жизни в блоке. – Sadique

+0

Последний вопрос: в чем разница между выполнением «char * x», противоположной «char x [10]»? – zProgrammer

0

Долгий путь - использовать malloc и malloc размер строки.

тест будет оттеснена на куче

http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

+0

'malloc' выделяет память в куче; это неверно или, по крайней мере, вводит в заблуждение, чтобы сказать, что «malloc» будет толкать его в стек ». – icktoofay

5

Вы объявляете массив указателей. Указатели указывают на строковые литералы.

Переменная test следует нормальному правилу, если это автоматическая переменная (область внутри некоторой функции), когда она выходит из функции, она выходит из области видимости, поэтому вам не нужно освобождать память. Если он статически выделен (глобальный или static переменной), он имеет жизнь до тех пор, пока программа, так что вам также не нужно освобождать память.

Строковые литералы, в которых указатели имеют статическое хранилище, поэтому вы также не освобождаете их.

0

Test - массив из charecter pointers. Когда инициализация значений предоставляется для массива, C позволяет оставлять квадратные скобки пустыми []. В этом случае компилятор примет размер для массива, который соответствует числу значений, заключенных между фигурными скобками { }. Нет необходимости освобождать.

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