簡體   English   中英

為什么靜態變量的溢出會導致段錯誤,而不是全局變量?

[英]Why does an overflow in a static variable cause seg fault but not global variables?

為什么對於第一組代碼,代碼會因分段錯誤而失敗,而對於第二組代碼卻不會,則失敗? (唯一的區別是,字符在第一個中是靜態的,但在第二個中不是靜態的)。

#include <string.h> 
#include <stdio.h>
static char a[16];
static char b[16];
static char c[32];
int main(int argc, char *argv[]) {
    strcpy(a, "0123456789abcdef");
    strcpy(b, "0123456789abcdef");
    strcpy(c, a);
    strcat(c, b); 
    printf("a = %s\n", a);
    return 0;
}

#include <string.h> 
#include <stdio.h>
char a[16];
char b[16];
char c[32];
int main(int argc, char *argv[]) {
    strcpy(a, "0123456789abcdef");
    strcpy(b, "0123456789abcdef");
    strcpy(c, a);
    strcat(c, b); 
    printf("a = %s\n", a);
    return 0;
}

起初,我認為這是因為它們的存儲位置,但它們都位於bss區域(全局和未初始化)。 根據我對Stackoverflow的了解和閱讀,所有靜態操作都是將變量限制為內部鏈接,而沒有其他操作。

(我知道沒有為空字符分配空間。此行為是一致的)。

只是因為運氣好。 每當您越過數組的已定義限制的邊界(無論是靜態還是全局)時,C中就不會進行數組邊界檢查,因此,您可能會或可能不會遇到運行時違規,運氣因素就在此in。您需要分配額外的空間,包括字符串null終止符:

char a[16+1];
char b[16+1];
char c[32+1];

基本上,兩個代碼段中的內容都是Array ofboundbound access ,這將導致未定義的行為。 因此,第一個代碼段可能會在其他系統上崩潰。 由於未定義行為,因此可能會發生任何事情,在您的情況下,您很幸運,沒有看到崩潰(第一個代碼段),但您永遠不能依靠它。

暫無
暫無

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

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