簡體   English   中英

為什么 free() 會修改 C 結構成員的值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM