1

У меня есть простая программа на C, которая имеет указатель на массив символов. Чтобы начать его, я использую malloc, а затем измените его размер, а затем установите его несколько раз позже в программе.gdb дает ошибку, но программа работает нормально

Когда я изменить его один раз realloc, GDB не показывает каких-либо ошибок, однако, при попытке вызова функции изменения размера снова, GDB показывает следующее сообщение об ошибке:

warning: Invalid Address specified to RtlReAllocateHeap(003E0000, 00404076) 

Любые идеи почему изменение размера более чем один раз дает эту ошибку?

EDIT

Я играл с ним, и, кажется, ошибка не происходит, когда я закомментируйте настройки данных указателя, который после изменения размера.

void setName(struct class_x *class, char *name) 
{ 
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1); 
    class->name = name; 
} 

void *reallocateMemory(void *member, size_t size) 
{ 
    void *tmp = realloc(member, size); 
    if(tmp == NULL) 
    { 
     //handle 
    } 
    return tmp; 
} 
+1

Как выглядит код, вызывающий realloc? – sth

+0

Вы проверяете ошибку после realloc? –

+1

Это не ошибка, это предупреждение – tur1ng

ответ

3

class->name = name не делает то, что вы думаете. Используйте strncpy(), чтобы скопировать входную строку в новую выделенную память. Это задание, которое у вас есть, вызывает утечку выделенной памяти и переписывание указателя. Затем в следующий раз, когда вы вызываете setName(), вы в конечном итоге вызываете realloc() с указателем, который вы не получили от malloc(). Я ожидаю, что вы вызываете setName() с постоянной, глобальной переменной или локальной строкой переменной, и это то, что в конечном итоге порождает ошибку. Если вы только когда-либо звонили setName() со строками, память которых вы получили от malloc(), вы не увидите предупреждение от gdb (но у вас все еще есть ошибка!).

+0

+1 для гвоздей! –

+1

И учитывая, что вы всегда перезаписываете то, что хранилось в выделенном буфере, нет необходимости использовать 'realloc' вообще - просто' free' и 'malloc' будет в порядке. – caf

0

запустить его под Valgrind или электрический забор - это запятнает перерасхода памяти для вас