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