簡體   English   中英

為什么我懸空的指針不會引起分段錯誤?

[英]Why my dangling pointer doesn't cause a segmentation fault?

我的代碼:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = (int *)malloc(sizeof(int));
    free(p);
    *p = 42;
    return 0;
}

我創建了一個指針,然后將其指向分配的空間,最后為它分配了42。 在我看來,它不起作用,應該導致分段錯誤,但它可以起作用。 所以為什么?

PS:我通常在Linux上使用Gcc對其進行編譯

真幸運 在這種情況下的行為是不確定的 即:無法預期會發生什么。

我認為它不應該工作,但是可以工作。

別擔心,這是行不通的。

它應該導致分段錯誤

告訴C標准委員會。 這只是未定義的行為,不需要崩潰。

除了“ undefined”之外,更詳盡的答案是,只要您位於分配給進程的內存區域內,就可以寫入C中的任意內存位置。 根據操作系統的不同,是否允許覆蓋代碼。 一旦您的進程的其他代碼被亂碼的存儲位置中的內容所混淆,不良后果只會出現。 由於您的程序在弄亂內存之后立即退出,因此某些代碼被混淆的機會顯然很小。

在這種情況下的行為是不確定的,

行為不確定的可能性

您可以在自由檢查“ p”之前和之后顯示p的內存地址:

#include <stdio.h>
#include <stdlib.h>

    int main(void) {
        int *p = (int *)malloc(sizeof(int));
         printf("before \n %p \n",p);
         free(p);
        *p = 42;
         printf("after\n %p \n",p);
         printf(" %d \n",*p);
        return 0;
    }

在free之前和之后,我們具有相同的地址存儲器,因為free()不會為p指針分配NULL,因此*p = 42; 盡管它的行為不確定,但它的工作原理類似於靜態分配。

建議使用FREE宏:

#define FREE(X) \
free(X);\
X=NULL;

使用此宏進行測試,您將看到預期的行為

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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