c - 连续的calloc调用破坏了一些内存

时间:2013-02-26 04:51:31

标签: c memory-management calloc

代码类似于:

char *global1 = NULL;
char *global2 = NULL;
char *global3 = NULL;
char *global4 = NULL;

void func2(char *gPtr, char **gPtrToInitialize)
{
    if(*gPtrToInitialize == NULL)                     // Here, gPtr is correct
    {
        *gPtrToInitialize = dlcalloc(MAX_PATH, 1);      
    }                              // Here, gPtr has trailing junk characters

    // Do some initialization
}

void func1()
{
    if(global1 == NULL)
    {
        global1 = dlcalloc(MAX_PATH, 1);
    }
    func2(global1, &global2);
    func2(global1, &global3);
    func2(global1, &global4);

    // Do other tasks

    // Free all allocated global variables
}

注意: 在上面的代码中,dlcalloc指的是Doug Lea malloc.c中定义的代码。


callocfunc2()

之前

gPtr =“C:\ Program Files \ Test \ Path.txt”

callocfunc2()

gPtr =“C:\ Program Files \ Test \Path.txt♂”


我的问题是,连续的dlcalloc()次调用是否有可能破坏其他变量的内存?上面的代码是我正在处理的一些大型代码库的一部分的概括。

2 个答案:

答案 0 :(得分:1)

好的家伙我刚刚解决了我的问题。这就是func2()中发生的事情:

  • gPtr指向0x009b0038
  • strlen("C:\Program Files\Test\Path.txt") = 30个字节。
  • 分配上的
  • *gPtrToInitialize指向0x009b0057gPtr部分结束后完全
  • 由于gPtr指向的字符串没有尾随'\ 0',gPtr上的任何字符串操作实际上都会进入*gPtrToInitialize的内存。

当我只添加一个尾随'\0'时,所有这些都解决了。

感谢您的所有答案!

答案 1 :(得分:0)

除非存在错误(不太可能),否则dlcalloc不应该有任何破坏内存其他部分的机会。它应该工作或失败,但不应该破坏任何东西。

我认为你应该看一下你对指针的使用,因为在上面的代码中你将global2,global3和global4的地址传递给func2。这些地址永远不应为null,因此永远不应该在func2中调用dlcalloc。

我怀疑func2应该是这样的:

void func2(char *gPtr, char **gPtrToInitialize)
{
    if(*gPtrToInitialize == NULL)                     // Here, gPtr is correct
    {
        *gPtrToInitialize = dlcalloc(MAX_PATH, 1);      
    }                              // Here, gPtr has trailing junk characters

    // Do some initialization
}

我会在代码的其他地方查找类似的指针错误,这些错误更可能导致内存损坏。

C指针很危险。