记忆分配C.

时间:2012-09-27 20:57:44

标签: c memory pointers free

我有一个内存分配问题。如果我在char*块中声明else,则意味着char*块在执行完else块时被销毁。 else块位于while循环中,因此它将迭代多次。但是,如果char*块中声明的else别名为malloc'd变量,如下例所示,该怎么办?我的问题是我如何收取这样的费用?我觉得如果我释放临时char*变量,我将导致分段错误,因为我将释放我想要保留的变量。如果是这种情况,我对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);
        }

(剪断)

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

3 个答案:

答案 0 :(得分: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总是指向动态的mallocated内存。请注意我们每free只有一个malloc

答案 1 :(得分:0)

你有2个指针:

print_paths:指向类似['h','e','l','l','o']的数组,此指针包含数组第一个元素的地址,在这种情况下它指向h,让我们说地址这个h的{​​{1}}是1,因此e的地址是2,依此类推......因此,print_path包含数字1 }。

temp_path:此指针指向内存中的任何内容或随机位置。

当你致电malloc时,malloc会要求一些内存,并为你提供新分配内存的地址,但这个内存包含垃圾。

所以

之后
print_path = (char*)malloc(temp_size);

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

最后,当你致电:

40

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

重要的是要注意,即使地址(e1)都包含值40,修改一个地址也不会影响另一个地址。

h的最佳位置就在free(temp_path)结束之前,只需检查else是否已分配内存,如果您尝试释放内存但未获得内存与temp_path你将会度过一段美好时光。

答案 2 :(得分:0)

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

相关问题