繁体   English   中英

C malloc指针多次

[英]C malloc a pointer multiple times

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

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

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

我有一个功能来释放所有用过的内存,所以不要担心free

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

所以

  1. 是的,你可以做另一个malloc。 (无论如何你可以做,但会松开对malloced内存的引用)

  2. 是的, ptr仍然引用了malloced区域

顺便说一句,如果在程序结束时提到这一点,那么在最后做一个自由可能是毫无意义 所以,我认为你的意思是, 在当前算法的最后

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

1)。 我可以tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) malloc再次没有免费吗?

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

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

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

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

malloc用于分配内存块。 它分配一个提供大小的内存块,并返回指向块开头的指针。

所以你第一次写

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

它分配内存并将指向内存位置开头的指针返回到temp。 现在,当您将tmp分配给ptr时,ptr现在指向已分配的内存以及tmp。 现在再次如果你编写tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) ,它将分配一个新的内存并返回一个指向tmp的指针。 但是ptr仍然继续指向先前分配的内存。 所以你的两个问题的答案都是肯定的。

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

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)}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM