![](/img/trans.png)
[英]In C, why are the first members of a struct frequently "reset" to 0 when it is deallocated with free()?
[英]Why does free() modify C struct members' values?
C 中的以下代碼是鏈表項目的開始,其中 memory 分配給一個節點(malloc),並將值分配給兩個結構成員,即數據(int)和指向下一個節點的指針:
typedef struct nodeA NodeA;
struct nodeA{
int data;
NodeA* next;
};
void main(){
NodeA* test1 = (NodeA*) malloc(1 * sizeof(NodeA));
test1->next = (NodeA*) malloc(1 * sizeof(NodeA));
test1->data = 999;
printf("NODE: next=%p data=%d\n", test1->next, test1->data);
printf("NEXT: next=%p data=%d\n", test1->next->next, test1->next->data);
free(test1);
printf("FREE NODE: next=%p data=%d\n", test1->next, test1->data);
printf("FREE NEXT: next=%p data=%d\n", test1->next->next, test1->next->data);
}
前兩個 printf() 的結果是有道理的。
但是,在釋放節點(結構)指針后,(該節點和下一個節點的)成員的值被修改:
NODE: next=0x563bd8335690 data=999
NEXT: next=(nil) data=0
FREE NODE: next=0x563bd8335010 data=0
FREE NEXT: next=(nil) data=1
為什么呢?
特別是,為什么下一個節點的數據在free()之后變成了1,而不是剩下的0?
非常感謝!
取消引用已釋放的指針是未定義的行為。 一旦你這樣做了,所有的規則都在 window 之外。 它可以按預期工作,它可能會產生無意義的結果,或者它可能會崩潰。 它的行為方式可以在運行之間改變。 因此,試圖理解程序的行為是沒有用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.