【发布时间】:2020-01-25 22:26:23
【问题描述】:
当我遇到这种情况时,我正在测试范围和可见性,但我找不到解释:
我有两个 .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 的声明?
谢谢!
【问题讨论】:
-
这是 UB。一个好的链接器会对此发出警告。
-
@o11c UB 是什么意思?
-
@CSstudZ 你已经破坏了游戏规则,如果你的编译器和链接器确实生成了一个程序,则不能保证它是一个有意义的程序。所有的赌注都取消了。 blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
-
@PSkocik,哦,所以我没有希望找到输出背后的逻辑?大声笑,我刚刚尝试删除行 i[1] = 'b';,现在我得到 i (main2) = 97。我不知道发生了什么
标签: c casting declaration extern linkage