【问题标题】:C malloc a pointer multiple timesC malloc 一个指针多次
【发布时间】:2016-04-02 05:17:36
【问题描述】:

如果我有指针:char ** tmp = (char **)malloc(sizeof(char *) * MAX_SIZE), 为每个块赋值后,我有一个新指针char ** ptr = tmp

1)。我可以在没有free 的情况下再次tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) malloc 吗?

2)。 ptr 是否仍然具有值,并且 tmp 是否指向新的内存块?

我有一个函数可以在最后释放所有使用的内存,所以不用担心free

【问题讨论】:

  • 简单回答 1=是,2=是。更多解释:当您malloc 第一次分配内存块并且tmp 获取指向该位置的指针时。然后您将指针存储到ptr(现在tmpptr 都有指向同一位置的指针)。当您调用第二个malloc 时,分配了另一块内存,tmp 获取新指针。但是ptr 还是有旧的。

标签: c memory-management malloc


【解决方案1】:

1)。我可以tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) malloc 再不释放它吗?

是的,您可以再次分配内存。但是tmp 现在将指向新分配的内存和以前分配的内存。

2)。 ptr 是否仍然具有值,并且 tmp 是否指向新的内存块?

现在tmp 将指向新分配的内存,但ptr 指的是先前分配的内存位置。

因此,通过这种方式,您不会丢失对任何内存块的引用并且可以被释放。

【讨论】:

    【解决方案2】:

    malloc 用于分配内存块。它分配给定大小的内存块,并返回指向块开头的指针。

    所以第一次写

    char ** tmp = (char **)malloc(sizeof(char *) * MAX_SIZE)
    

    它分配内存并将指向内存位置开始的指针返回给 temp。现在,当您将 tmp 分配给 ptr 时,ptr 现在与 tmp 一起指向分配的内存。现在,如果您再次写入tmp = (char **)malloc(sizeof(char *) * MAX_SIZE),它将分配一个新内存并返回一个指针,tmp 将指向该指针。但是 ptr 仍然继续指向之前分配的内存。所以你的两个问题的答案都是YES。

    我希望我能够正确地解释这些事情。

    【讨论】:

    • 很好的解释!谢谢!
    【解决方案3】:

    tmp 分配给ptr 会保留对分配的内存区域的引用。因此,使用对malloc 的新调用重新分配 tmp 不是问题。这不会丢失对分配内存的引用,因为ptr 是现有别名。

    所以

    1. 是的,您可以执行另一个 malloc。 (无论如何你都可以这样做,但会松散对分配内存的引用)

    2. 是的,ptr 仍然引用分配区域

    顺便说一句,如果在程序结束时引用 ,那么在末尾做一个免费的 可能会毫无意义。所以,我假设你的意思是,在当前算法的末尾

    无论如何,您需要保留对已分配内存的引用。通常建议在不再使用时立即释放此类内存。

    【讨论】:

    • 是的,我明白了,因为我将在另一个函数中使用这些引用,使用它后,内存将立即释放。感谢您的建议!
    【解决方案4】:
    int main(int argc, char **argv) {
    
        tmp = (char**)malloc(sizeof(char*) * argc);
        while (argv[i])
        {
            tmp[i] = strdup(argv[i]);
            i++;
        }
        if (argc > 3)
           printf("%s", argv[2])
        return(0)}
    

    【讨论】:

    • 这不能回答 OP 的问题。此外,没有解释的代码也不是很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 2013-10-06
    • 1970-01-01
    • 2011-06-25
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多