簡體   English   中英

當我訪問超出我分配的內存時,為什么我沒有得到堆棧粉碎錯誤?

[英]Why am I not getting stack smashing error when I access memory beyond what I allocated?

我應該在這里得到堆棧粉碎錯誤。 我沒有得到它的原因是什么?

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

struct mun
{
    int len;
    char str[0];

};

int main(void)
{

    //char mp[8];
    struct mun *p=malloc(sizeof(struct mun)+2);
    p->len=8;
    strcpy(p->str,"munjalllfff");
    //strcpy(mp,"munjalllfff");

    printf("%s\n",p->str);
    //printf("%s\n",mp);

    return 0;
}

如果可能請解釋或(主題名稱或鏈接對我來說足夠了。)

大多數C實現都不會費心保護堆棧或堆只被幾個字節覆蓋。 (有一個名為Electric Fence的圖書館,可以這樣做)。 有可能,如果你寫了足夠的數據,你最終會寫出超出允許的地址空間,程序會以某種方式崩潰(這取決於許多因素,如操作系統,編譯器,選項)。 正如你現在所注意到的,這個答案非常模糊。 原因是你所做的是技術上被C標准稱為未定義的行為 ,這意味着實現可以自由地做任何事情,包括什么都不做。

為什么會這樣? 為什么C標准沒有條款說

3.1.4.1.5當嘗試在分配的內存之外進行訪問時,等同於fprintf(stderr, "illegal access at %p\\n", (void *)address);的語句fprintf(stderr, "illegal access at %p\\n", (void *)address); 應執行。

原因是這會給實施帶來沉重的負擔。 在幾乎所有指針修改和函數調用之后,編譯器可能必須生成代碼來檢查非法訪問。 在設計上,C是一種微小的語言,程序員主要得到他們所要求的東西,而且沒有“隱形代碼”。

然后, stderr可能已關閉或不存在:-)

您正在調用未定義的行為。 什么事情都可能發生。 如果你很幸運,它會崩潰,如果你運氣不好,它會為你注冊Google+。

這不在堆棧上,使用free(p),你可能會看到一些錯誤!

這顯然是未定義的行為 它可能工作,可能不會!

為了避免它,你應該在復制字符串時使用strncpy()

strncpy(p->str,"munjalllfff",sizeof(p->str));

另外,不要忘記使用malloc() free()已分配的malloc()

暫無
暫無

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

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