簡體   English   中英

為什么我在下面的 pgm 中被堆棧粉碎?

[英]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";
  1. s[10]的定義中使用s s[10]和之后使用 s[10] 是有區別的。 定義中s[10]意味着您要定義一個包含 10 個元素的char數組。 s 定義后的s s[10]表示您要訪問數組s的第 11 個元素,該元素不存在。

    索引計數從0開始,而不是1 所以 s 的第10個元素是s s[9]


  1. 您嘗試將字符串文字分配給數組或更具體的數組元素,這在 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 數組可從09尋址,在第10個偏移量處寫入將寫入數組邊界(出於某種原因,C 允許)但也正好在堆棧指針上,這會導致觸發檢測堆棧粉碎。

暫無
暫無

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

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