![](/img/trans.png)
[英]Why realloc with size '0' allows to free the pointer multiple times but not malloc with size '0'?
[英]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
是一個現有的別名。
所以
是的,你可以做另一個malloc。 (無論如何你可以做,但會松開對malloced內存的引用)
是的, 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.