2014-09-26 4 views
0

Я прошел через пример relloc в C here. Я не мог понять, что делает realloc() в этом фрагменте, потому что даже когда я прокомментировал инструкцию realloc, программа прошла нормально. Я снова добавляю код здесь, чтобы вам было легче пройти.Что делает realloc в этом фрагменте кода?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
char *str; 

/* Initial memory allocation */ 
str = (char *) malloc(15); 
strcpy(str, "tutorialspoint"); 
printf("String = %s, Address = %u\n", str, str); 

/* Reallocating memory */ 
str = (char *) realloc(str, 25); 
strcat(str, ".com"); 
printf("String = %s, Address = %u\n", str, str); 

free(str); 

return(0); 
} 

Насколько я понял таНос() первоначально выделила строку, чтобы быть длиной 15 байт, а затем перераспределить() переназначить ее, чтобы быть 25 символов. Но как он все еще работает нормально, хотя я удаляю оператор realloc() из фрагмента? Я что-то упустил из этого?

+0

Поскольку память уже была выделена, указатель остается в силе. realloc() просто выполняет перераспределение ранее выделенной памяти или если указатель предоставлен NULL, он будет делать malloc(). поэтому в вашем примере выделена область памяти. удалив realloc(), он не был перераспределен или изменен, но исходный указатель все еще действителен. –

+1

Это не работает, вы развращаете кучу. И нет, вы * не * гарантированно попадете на пальцы пальцев, делая это, ваша программа будет килить, когда вы меньше всего этого ожидаете. Давно после того, как был нанесен урон, что затрудняет поиск ошибки. Урок, который вы запомните. –

ответ

2

Но как он все еще работает нормально, хотя я удаляю инструкцию realloc() из фрагмента?

Если вы удалите realloc(), возможно, код работает нормально, но это несчастный случай. Код по-прежнему ошибочен, он имеет переполнение буфера, и результатом является «неопределенное поведение», что означает, что он может работать нормально, он может упасть, он может дать неверный ответ, он может отформатировать ваш жесткий диск - он возможно сделать ставку все.

Исправьте свой код.

Если вы используете GCC 4.8 или новее, я предлагаю использовать дезинфицирующее средство для адреса. Скомпилируйте свой код следующим образом:

gcc main.c -o main -fsanitize=address -Wall -Wextra 
        ^^^^^^^^^^^^^^^^^^ 

Для этого требуется, чтобы в вашей системе была установлена ​​библиотека дезинфицирующего средства. Кроме того, запустите свой код в инструменте memcheck Valgrind.

valgrind ./main 

Оба инструмента покажут, что ваша программа неверна.

+0

+1. Добавление: Запустите его в valgrind и сообщит вам о переполнении буфера. – bitmask

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