繁体   English   中英

为什么静态变量的溢出会导致段错误,而不是全局变量?

[英]Why does an overflow in a static variable cause seg fault but not global variables?

为什么对于第一组代码,代码会因分段错误而失败,而对于第二组代码却不会,则失败? (唯一的区别是,字符在第一个中是静态的,但在第二个中不是静态的)。

#include <string.h> 
#include <stdio.h>
static char a[16];
static char b[16];
static char c[32];
int main(int argc, char *argv[]) {
    strcpy(a, "0123456789abcdef");
    strcpy(b, "0123456789abcdef");
    strcpy(c, a);
    strcat(c, b); 
    printf("a = %s\n", a);
    return 0;
}

#include <string.h> 
#include <stdio.h>
char a[16];
char b[16];
char c[32];
int main(int argc, char *argv[]) {
    strcpy(a, "0123456789abcdef");
    strcpy(b, "0123456789abcdef");
    strcpy(c, a);
    strcat(c, b); 
    printf("a = %s\n", a);
    return 0;
}

起初,我认为这是因为它们的存储位置,但它们都位于bss区域(全局和未初始化)。 根据我对Stackoverflow的了解和阅读,所有静态操作都是将变量限制为内部链接,而没有其他操作。

(我知道没有为空字符分配空间。此行为是一致的)。

只是因为运气好。 每当您越过数组的已定义限制的边界(无论是静态还是全局)时,C中就不会进行数组边界检查,因此,您可能会或可能不会遇到运行时违规,运气因素就在此in。您需要分配额外的空间,包括字符串null终止符:

char a[16+1];
char b[16+1];
char c[32+1];

基本上,两个代码段中的内容都是Array ofboundbound access ,这将导致未定义的行为。 因此,第一个代码段可能会在其他系统上崩溃。 由于未定义行为,因此可能会发生任何事情,在您的情况下,您很幸运,没有看到崩溃(第一个代码段),但您永远不能依靠它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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