首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态全局变量与全局变量C

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

Stack Overflow用户
提问于 2015-04-07 21:36:58
回答 2查看 396关注 0票数 2

我有下面的程序。如果我声明变量a,b,c静态全局变量,它会给出分段错误,但是如果我声明它们为非静态全局变量或局部变量,则不会出现分段错误。为什么它会这样表现呢?我知道有比变量所能存储的数据更多的数据,但是为什么只有声明的静态才会产生seg错误呢?静态声明的变量是否存储在不允许覆盖的堆栈框架的某些不同部分?

编辑:我知道strcpy不安全。但这不是我的问题。我想了解为什么一个溢出会产生分段错误,为什么另一个溢出可能不会产生分段错误。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-07 21:49:26

堆栈变量中的内存对齐非常重要。尝试使用-fstack保护-强或类似的堆栈保护选项,您将看到崩溃。同样,在c之后声明一个int并溢出您的数组c,您可以看到崩溃。你需要确保没有垫子。因为b是一个数组,所以无论你从'a‘溢出到b,请尝试如下:

代码语言:javascript
复制
struct foo {
        char c[10];
        int x;
    } __attribute__((packed));

当c溢出时,您将看到崩溃。

当您溢出时,您正在发生未定义的行为。

票数 0
EN

Stack Overflow用户

发布于 2015-04-07 21:42:08

注意C中的const char*字符串总是以0结尾,这意味着字符串“0123456789abc the”实际上是17个字符:"0123456789abcdef\0"

我建议您始终使用安全版本。

代码语言:javascript
复制
strncpy() 

您还可以查看文档,该文档显式地告诉您包含空字符。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29501783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档