0

我有一个内存分配问题。如果我char*在一个else块中声明 a ,这意味着当块执行char*完毕时它被销毁。elseelse块位于while循环中,因此它将迭代多次。但是,如果块中char*声明的else别名为malloc'd变量,如下例所示。我的问题是我如何收取这样的费用?我觉得如果我释放 tempchar*变量,我会导致分段错误,因为我也会释放我想要保留的变量。如果是这样的话,我不知道该free声明的去向。

char* print_path = NULL;

(剪断)

  (while)

 else{
        char* temp_path = print_path;
        int temp_size = strlen(temp_path)+strlen(file_name(child->fts_path))+1;
        print_path = (char*)malloc(temp_size);
        strcpy(print_path, temp_path);
        strncat(print_path, file_name(child->fts_path), strlen(file_name(child->fts_path)));
        printf("%s:\n\n", print_path);
        }

(剪断)

我想指出,在我知道它不会再次执行之后,我在程序结束时执行了 free print_path。但是,我想释放的是循环的中间执行。任何帮助,将不胜感激。谢谢!

4

3 回答 3

2

看起来free(temp_path)是对的。它应该是这样的:

char * print_path = malloc(...);    // "NULL" is also possible

while (condition)
{
    if (...)
    {
         // ...
    }
    else
    {
        char * temp_path = print_path;

        print_path = malloc(...);

        free(temp_path);
    }
}

free(print_path);

算法中的不变量是(或应该是)print_path始终指向动态分配的内存。请注意我们如何精确地free为每个malloc.

于 2012-09-27T21:00:57.883 回答
0

你有2个指针:

print_paths: 指向一个数组,比如['h','e','l','l','o'],这个指针包含数组第一个元素的地址,在这种情况下它指向h,可以说 this 的地址h1,所以,eis的地址2等等......因此,print_path包含数字1

temp_path: 这个指针不指向任何东西或指向内存中的随机位置。

当你调用时mallocmalloc请求一些内存并给你新分配的内存的地址,但是这个内存包含垃圾。

所以之后

print_path = (char*)malloc(temp_size);

print_path包含新分配内存的地址,一个大小temp_size为垃圾的新数组,假设这个地址是 40,所以print_path值为40

最后,当你打电话时:

strcpy(print_path, temp_path);

temp_path您将数组( )的值复制['h','e','l','l','o']到 指向的数组print_path,换句话说,地址40而不是包含垃圾的地址现在包含h41包含e等等。

重要的是要注意,即使 address (140) 都包含 value h,修改一个不会影响另一个。

最好的地方free(temp_path)是在结束之前else,只要检查temp_path分配的内存,如果你试图释放它没有获得的内存,你malloc会度过一段糟糕的时光。

于 2012-09-27T21:51:36.590 回答
0

我相信,既然我想要做的事情是将内存重新分配给同一个变量,我应该研究 realloc 而不是 malloc。

于 2012-10-06T21:32:49.427 回答