2015-02-05 52 views
-1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void main() { 
    char *a = "aaaaaaaaaaaaaaaa"; 
    char b[1]; 
    strcpy(b, a); 
    printf("%s\n", b); 
} 

運行時,它打印:當strcpy()導致緩衝區溢出時爲什麼沒有分段錯誤?

aaaaaaaaaaaaaaaa 

如果我做*超長,例如,* A = 「aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa」,那麼就會造成一個段錯誤。

爲什麼在第一種情況下沒有溢出?

+2

未定義的行爲。該程序在您的浴室中產生一頭大象完全有效。 – EOF 2015-02-05 19:29:28

+0

C語言中沒有「分段錯誤」這樣的事情。你可以做任何事情,包括跨越其他記憶。當你做這些事時會發生什麼,這就是我們不知道的 - 也許程序會崩潰,也許它會「起作用」,也許它在一臺機器上工作,並在另一臺機器上崩潰等等。這就是所謂的「未定義行爲'。 – PaulMcKenzie 2015-02-05 19:35:43

+0

這是一個多重複制,但不能找到一個副本。 – 2015-02-05 19:49:58

回答

2

當程序嘗試訪問不屬於程序虛擬地址空間的內存時,會發生分段錯誤;如果您剛剛在原始複製目標之後覆蓋了一些內容,則不會發生這種情況。

0

存在緩衝區溢出,並不意味着它總是會出現分段錯誤。這是未定義的行爲 - 可能是段錯誤。它取決於你的變量在內存後的「放置」。

0

似乎工作,或者,就此而言,不會崩潰,是一種未定義行爲的有效形式。 任何可能發生在你的程序有UB時。這就是爲什麼它是非常不可取的。