2015-05-14 2 views
1
char* get_string() { 
char * a = malloc(sizeof(char)*5); 
    a = "asdf"; 
    return a; 
} 

Может кто-нибудь объяснить, почему эта функция вызовет утечку памяти?Назначение указателя на строку в c

+5

Ну, вы позвонили в malloc, и вы не позвонили бесплатно .. – Blorgbeard

+0

, но предположим, что я хочу, чтобы моя функция возвращала «asdf», как бы я это сделал и избежать утечки памяти? – wiwen

ответ

4

Вы сначала инициализировали a указателем на местоположение в памяти. Затем вы повторно назначаете a другому указателю на местоположение, занимаемое строкой asdf, поэтому вы потеряли первый указатель на выделенную память. вы никогда не сможете их освободить, так как вы потеряли 5-битную память, выделенную malloc изначально.

Здесь вы пропустите эти 5 байт памяти.

Если вы хотите скопировать asdf в память, указанную a, вы можете использовать strcpy.

strcpy(a, "asdf"); 

Таким образом, вам нужно позвонить free в коде где-то, чтобы избежать утечек.

+0

Как бы вы тогда присвоили что-нибудь? Это char * a = "asdf" без malloc? – wiwen

0

"char * a;"

a Здесь указатель, он может указывать на что угодно.

«a = (char *) 0x0000» должно быть действительным, но не логичным;

"long l = 12345L; a = (char *) & l;" это также должно быть законным, но не логичным

«asdf» - это статическая строка в вашем примере, она хранится в памяти, выделенной во время компиляции. Вы можете просто «вернуться» («asdf»); от вашей функции, понимая, что она находится в статически выделенном пространстве памяти, определенном во время компиляции. Работа с указателями без понимания схем логической памяти будет иметь последствия, которые вы скоро узнаете; ~).

+0

malloc(), calloc() и strdup() резервируют память из «кучи», пула динамической памяти, который со временем становится фрагментированным с последующими выделениями. Статические строки находятся в различном пространстве памяти, которое смежно, «char * a =« My String »; char * b =« Ваша строка »; заканчиваются в статическом блоке памяти как «My String \ 0Your String \ 0», который никогда не может изменить размер.Указатели a и b могут быть позже назначены для точки в любом месте, но не пытайтесь переместить/изменить место, на которое они указали, на исходное назначение ... большая проблема, возможно, нарушение защиты. отказ от ответственности: 15 лет в отставке –

3

Короткий ответ:

char * a = malloc(sizeof(char)*5); 

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

затем

a = "asdf"; 

теперь вы назначили как указание на статической ячейке памяти время компиляции, где строка "asdf" хранится (скажем 0x0BADBEEF, это не в динамической куче). Вы уже не знаете, где, черт возьми, вы выделили память из вызова malloc выше (это было в 0x1234EEEE, но теперь у вас нет ссылки на него), поэтому вы никогда не сможете освободить() это ... это утечка;

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