我有一个简单的C程序,它有一个指向字符数组的指针。要启动它,我使用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;
}
答案 0 :(得分:3)
class->name = name
并没有按照您的想法行事。使用strncpy()
将输入字符串复制到新分配的内存中。你在那里的任务是泄漏你分配的内存并覆盖指针。然后,当您下次致电setName()
时,您最终会使用您未从realloc()
获得的指针调用malloc()
。我希望你用某个常量,全局变量或局部变量字符串调用setName()
,这就是最终产生错误的地方。如果您只是使用setName()
来自malloc()
的字符串来调用{{1}},那么您将看不到来自gdb的警告(但您仍然有错误!)。
答案 1 :(得分:0)
在valgrind或电围栏下运行 - 这些将为你发现内存超支