char* get_string() {
char * a = malloc(sizeof(char)*5);
a = "asdf";
return a;
}
Может кто-нибудь объяснить, почему эта функция вызовет утечку памяти?Назначение указателя на строку в c
char* get_string() {
char * a = malloc(sizeof(char)*5);
a = "asdf";
return a;
}
Может кто-нибудь объяснить, почему эта функция вызовет утечку памяти?Назначение указателя на строку в c
Вы сначала инициализировали a
указателем на местоположение в памяти. Затем вы повторно назначаете a
другому указателю на местоположение, занимаемое строкой asdf
, поэтому вы потеряли первый указатель на выделенную память. вы никогда не сможете их освободить, так как вы потеряли 5-битную память, выделенную malloc изначально.
Здесь вы пропустите эти 5 байт памяти.
Если вы хотите скопировать asdf
в память, указанную a
, вы можете использовать strcpy
.
strcpy(a, "asdf");
Таким образом, вам нужно позвонить free
в коде где-то, чтобы избежать утечек.
Как бы вы тогда присвоили что-нибудь? Это char * a = "asdf" без malloc? – wiwen
"char * a;"
a Здесь указатель, он может указывать на что угодно.
«a = (char *) 0x0000» должно быть действительным, но не логичным;
"long l = 12345L; a = (char *) & l;" это также должно быть законным, но не логичным
«asdf» - это статическая строка в вашем примере, она хранится в памяти, выделенной во время компиляции. Вы можете просто «вернуться» («asdf»); от вашей функции, понимая, что она находится в статически выделенном пространстве памяти, определенном во время компиляции. Работа с указателями без понимания схем логической памяти будет иметь последствия, которые вы скоро узнаете; ~).
malloc(), calloc() и strdup() резервируют память из «кучи», пула динамической памяти, который со временем становится фрагментированным с последующими выделениями. Статические строки находятся в различном пространстве памяти, которое смежно, «char * a =« My String »; char * b =« Ваша строка »; заканчиваются в статическом блоке памяти как «My String \ 0Your String \ 0», который никогда не может изменить размер.Указатели a и b могут быть позже назначены для точки в любом месте, но не пытайтесь переместить/изменить место, на которое они указали, на исходное назначение ... большая проблема, возможно, нарушение защиты. отказ от ответственности: 15 лет в отставке –
Короткий ответ:
char * a = malloc(sizeof(char)*5);
вы выделили память здесь из кучи, а имеет адрес в куче (скажем 0x1234EEEE
), указывая в динамической памяти. Вам нужно освободить это выделение, когда закончите, иначе произойдет утечка памяти.
затем
a = "asdf";
теперь вы назначили как указание на статической ячейке памяти время компиляции, где строка "asdf"
хранится (скажем 0x0BADBEEF
, это не в динамической куче). Вы уже не знаете, где, черт возьми, вы выделили память из вызова malloc выше (это было в 0x1234EEEE
, но теперь у вас нет ссылки на него), поэтому вы никогда не сможете освободить() это ... это утечка;
Ну, вы позвонили в malloc, и вы не позвонили бесплатно .. – Blorgbeard
, но предположим, что я хочу, чтобы моя функция возвращала «asdf», как бы я это сделал и избежать утечки памяти? – wiwen