簡體   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