释放指向指针数组的int指针可以很好地工作,但在主程序中崩溃

时间:2015-05-12 09:02:03

标签: c pointers malloc free dynamic-memory-allocation

此代码段本身可以正常工作,但是一旦我将其集成到我的完整main()函数中,我就会遇到free(0的问题,有时会在第一次迭代时失败,有时会在随机失败我和有时当我尝试释放int指针时。

int main()
{
    int** GPRIListedCoords = calloc(sizeof(int*), GPRIMaxVal);
    int i;
    for(i = 0; i < GPRIMaxVal; i++)
        GPRIListedCoords[i] = calloc(sizeof(int) , 2);
    for( i = 0; i < GPRIMaxVal; i++ )
        free(GPRIListedCoords[i]);
    free(GPRIListedCoords);
    return 0;
}

我以相同的方式创建/释放char指针(指针),没有任何问题。

我尝试捕获任何空指针,但我没有得到任何指针。

GDB Stack信息:http://i.snag.gy/Z3ZqV.jpg

2 个答案:

答案 0 :(得分:1)

此代码示例看起来很好。我认为问题出在另一种情况下,你用其分配的指针。根据{{​​1}}的{​​{3}}(强调我的)

  

free()

     

void free(void *ptr);函数释放free()指向的内存空间,该内存空间必须是之前调用ptrmalloc()或{{ 1}} 即可。否则,或者如果之前已调用calloc(),则会发生未定义的行为。如果ptr为realloc(),则不执行任何操作。

因此,在这种情况下,如果更改了free(ptr) - ed指针,您将面临man page

您可以使用调试器(例如,Linux上的NULL)来检查分配的内存位置,并查看指针是否已更改。

答案 1 :(得分:0)

此代码看起来很好。但是,如果代码的任何部分正在调用未定义的行为,那么它可能会破坏内部malloc数据结构,从而导致崩溃。

你可以在Linux上运行你的程序吗?我发现使用valgrind(Linux工具)经常可以摆脱这些错误。