我有下面的程序。如果我声明变量 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;
}