[英]why i'm getting stack smashing for the below pgm?
#include<stdio.h>
int main()
{
char s[10] = "hello";
printf("s = %s\n",s);
}
對於以上 pgm 我得到正確的 output 但對於以下 pgm
#include<stdio.h>
int main()
{
char s[10];
s[10] = "hello";
printf("s = %s\n",s);
}
對於上面的 pgm,我得到了堆棧粉碎為什么會發生堆棧粉碎。
s[10] = "hello";
在s[10]
的定義中使用s
s[10]
和之后使用 s[10] 是有區別的。 定義中s[10]
意味着您要定義一個包含 10 個元素的char
數組。 s 定義后的s
s[10]
表示您要訪問數組s
的第 11 個元素,該元素不存在。
索引計數從0
開始,而不是1
。 所以 s 的第10
個元素是s
s[9]
。
您嘗試將字符串文字分配給數組或更具體的數組元素,這在 C 中是不允許的。 唯一的例外是初始化一個char
數組(在定義處賦值),就像在第一個示例中一樣。
要通過字符串文字分配數組,請使用strcpy()
:
#include <stdio.h>
int main(void)
{
char s[10];
strcpy(s, "hello");
printf("s = %s\n",s);
}
如您所見,堆棧地址是遞減的,這意味着對於您的變量, s
的結尾將觸及您當前堆棧 scope 的開頭。
Stack pointer
S V
0123456789#PPPPPP
^
Stack guard
通常,您的堆棧 scope 將由堆棧保護填充,如果這些值將被覆蓋,則有助於檢測堆棧粉碎。 的硬件會檢測到這一點。
然后來找你代碼:
s[10] = "hello";
相當於
s[10] = {some char pointer}
雖然沒有反映您的意圖,但可能會起作用。
問題是您的 char 數組可從0
到9
尋址,在第10
個偏移量處寫入將寫入數組邊界(出於某種原因,C 允許)但也正好在堆棧指針上,這會導致觸發檢測堆棧粉碎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.