繁体   English   中英

静态全局变量与全局变量C

[英]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() 

您还可以查看文档,该文档明确告诉您包含空字符。

http://www.cplusplus.com/reference/cstring/strcpy/

内存对齐在堆栈变量中很重要。 尝试使用-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM