gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:55:06 26 4
gpt4 key购买 nike

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

#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 上的理解和阅读,所有 static 所做的就是将变量限制为内部链接,但仅此而已。

(我知道空字符没有分配空间,这个行为是一致的)

最佳答案

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

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

关于c - 为什么静态变量中的溢出会导致段错误而不是全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29505715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com