C gdb给出了一个错误,但程序运行正常
我有一个简单的C程序,它有一个指向字符数组的指针。要启动它,我使用C gdb给出了一个错误,但程序运行正常,c,memory-management,malloc,dynamic-memory-allocation,realloc,C,Memory Management,Malloc,Dynamic Memory Allocation,Realloc,我有一个简单的C程序,它有一个指向字符数组的指针。要启动它,我使用malloc,然后调整大小,然后在程序中设置x次 当我使用realloc调整一次大小时,gdb不会显示任何错误,但是,如果我再次尝试调用resize函数,gdb会显示以下错误: warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 ) 你知道为什么多次调整大小会导致这个错误吗 编辑 我对它进行了处理,当我注释掉指针数据的设置时,似乎
malloc
,然后调整大小,然后在程序中设置x次
当我使用realloc
调整一次大小时,gdb不会显示任何错误,但是,如果我再次尝试调用resize函数,gdb会显示以下错误:
warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 )
你知道为什么多次调整大小会导致这个错误吗
编辑
我对它进行了处理,当我注释掉指针数据的设置时,似乎没有发生错误,这是在调整大小之后
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;
}
在valgrind或electric fence下运行它-这些将为您发现内存溢出
class->name=name
没有做您认为应该做的事情。使用strncpy()
将输入字符串复制到新分配的内存中。您的分配正在泄漏分配的内存并覆盖指针。然后,下次调用setName()
时,您最终调用的realloc()
指针不是从malloc()
获得的。我希望您在某个地方使用常量、全局变量或局部变量字符串调用setName()
,这就是最终生成错误的原因。如果您仅使用从malloc()
获得内存的字符串调用setName()
,您将不会看到来自gdb的警告(但您仍然会有错误!)。调用realloc的代码是什么样子的?您是否在realloc之后检查失败?这不是错误,这是警告我认为您在第42行有错误。或者,向我们展示一些代码。考虑到您总是覆盖存储在分配的缓冲区中的内容,根本不需要使用realloc
——只要free
和malloc
就可以了。