为什么代码会因第一组代码的段错误而失败,而第二组代码却不会? (唯一的区别是字符在第一个中是静态的,而在第二个中不是静态的)。
#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/