Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gdb给出了一个错误,但程序运行正常_C_Memory Management_Malloc_Dynamic Memory Allocation_Realloc - Fatal编程技术网

C gdb给出了一个错误,但程序运行正常

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 ) 你知道为什么多次调整大小会导致这个错误吗 编辑 我对它进行了处理,当我注释掉指针数据的设置时,似乎

我有一个简单的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;
}

在valgrind或electric fence下运行它-这些将为您发现内存溢出

class->name=name
没有做您认为应该做的事情。使用
strncpy()
将输入字符串复制到新分配的内存中。您的分配正在泄漏分配的内存并覆盖指针。然后,下次调用
setName()
时,您最终调用的
realloc()
指针不是从
malloc()
获得的。我希望您在某个地方使用常量、全局变量或局部变量字符串调用
setName()
,这就是最终生成错误的原因。如果您仅使用从
malloc()
获得内存的字符串调用
setName()
,您将不会看到来自gdb的警告(但您仍然会有错误!)。

调用realloc的代码是什么样子的?您是否在realloc之后检查失败?这不是错误,这是警告我认为您在第42行有错误。或者,向我们展示一些代码。考虑到您总是覆盖存储在分配的缓冲区中的内容,根本不需要使用
realloc
——只要
free
malloc
就可以了。