我有下面的程序。如果我声明变量a,b,c静态全局变量,它会给出分段错误,但是如果我声明它们为非静态全局变量或局部变量,则不会出现分段错误。为什么它会这样表现呢?我知道有比变量所能存储的数据更多的数据,但是为什么只有声明的静态才会产生seg错误呢?静态声明的变量是否存储在不允许覆盖的堆栈框架的某些不同部分?
编辑:我知道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;
}发布于 2015-04-07 21:49:26
堆栈变量中的内存对齐非常重要。尝试使用-fstack保护-强或类似的堆栈保护选项,您将看到崩溃。同样,在c之后声明一个int并溢出您的数组c,您可以看到崩溃。你需要确保没有垫子。因为b是一个数组,所以无论你从'a‘溢出到b,请尝试如下:
struct foo {
char c[10];
int x;
} __attribute__((packed));当c溢出时,您将看到崩溃。
当您溢出时,您正在发生未定义的行为。
发布于 2015-04-07 21:42:08
注意C中的const char*字符串总是以0结尾,这意味着字符串“0123456789abc the”实际上是17个字符:"0123456789abcdef\0"。
我建议您始终使用安全版本。
strncpy() 您还可以查看文档,该文档显式地告诉您包含空字符。
http://www.cplusplus.com/reference/cstring/strcpy/
https://stackoverflow.com/questions/29501783
复制相似问题