当我遇到这种情况时,我正在测试范围和可见性,我找不到有关的解释:
我有两个.c文件:
F1.c
#include <stdio.h>
void Modify();
int i;
int j;
int main()
{
i=1;
printf("i (main 1) = %d\n", i);
Modify();
printf("i (main 2) = %d\n", i);
return 0;
}
和F2.c
#include <stdio.h>
extern char i [10];
extern int j;
void Modify()
{
j=0;
i[0]='a';
i[1]= 'b';
i[4]= 'e';
printf("i (Modify) = %c\n", i[0]);
printf("j (Modify) = %d\n", j);
}
当我编译并链接它们以创建我启动的可执行文件时,结果是:
i(main 1)= 1
i(修改)= a
j(修改)= 0
i(main 2)= 25185
发生了什么事?我会改变类型吗?给定大小的数组是否会超过F1.c中i的声明?
谢谢!
这违反了C的规则。外部全局变量需要具有一致的声明。 (这就是为什么我们使用标题来保持一致性的原因。)您已授予工具集处理麻烦的权限。
话虽这么说,您的情况是对象被简单地覆盖了(可能为int
和char[10]
分配了足够的存储空间,有点像那里有union
。仅分配了4个字节(仅针对int
,而不是数组),然后i[4]
访问将覆盖某些内容或不太可能导致段错误。]
25185
是0x6261
,假设小端架构对应于{0x61, 0x62, 0x00, 0x00}
,即{'a', 'b', 0, 0 }
。该数字中不包含'e'
,因为您的体系结构的int
长4个字节,'e'
放在第5个字节。
同样,您处于UB领域,所以没有一个可以保证的行为。