[英]Static global variables vs global variables C
我有下面的程序。 如果我將變量a,b,c聲明為靜態全局變量,則會出現分段錯誤,但是如果我將其聲明為非靜態全局變量或作為局部變量,則不會出現分段錯誤。 為什么會這樣表現? 我知道數據存儲的量超過了變量,但是為什么僅聲明為靜態時它會產生段錯誤? 是否將靜態聲明的變量存儲在堆棧框架的某些不允許覆蓋的不同部分中?
編輯:我知道strcpy是不安全的。 但這不是我的問題。 我想了解為什么一個溢出會產生段錯誤,為什么另一個溢出可能不會產生段錯誤。
#include<stdio.h>
#include<string.h>
static char a[16];
static char b[16];
static char c[32];
int main(int argc, char *argv[]){
// char a[16];
//char b[16];
//char c[32];
strcpy(a,"0123456789abcdef");
strcpy(b,"0123456789abcdef");
strcpy(c,a);
strcpy(c,b);
printf("a = %s\n",a);
return 0;
}
請注意,C中的const char *字符串始終以0結尾,這意味着字符串“ 0123456789abcdef”實際上是17個字符: "0123456789abcdef\\0"
我建議您始終使用安全版本
strncpy()
您還可以查看文檔,該文檔明確告訴您包含空字符。
內存對齊在堆棧變量中很重要。 嘗試使用-fstack-protector-strong或類似的堆棧保護選項,您將看到崩潰。 同樣在c之后聲明一個int並溢出數組c,您可以看到崩潰。 您需要確保沒有填充。 因為b是一個數組,所以從'a'溢出的所有內容都會進入b。 嘗試類似:
struct foo {
char c[10];
int x;
} __attribute__((packed));
當您溢出c時,您將看到崩潰。
當您溢出時,您將遇到未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.