C中不同类型的外部变量
Extern variable with different types in C
当我遇到这种情况时,我正在测试范围和可见性我找不到解释:
我有两个 .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);
}
当我编译并 link 它们来创建我启动的可执行文件时,结果如下:
i(主1)=1
i (修改) = a
j(修改)= 0
i(主2)=25185
这是怎么回事?我会改变类型吗?给出一个大小的数组是否会超过 F1.c 中 i 的声明?
谢谢!
这违反了 C 的规则。外部全局变量需要有一致的声明。 (这就是我们使用 headers 来保持一致性的原因。)您已授权您的工具集将事情搞得一团糟。
也就是说,您的情况是 objects 只是重叠(可能为 int
和 char[10]
分配了足够的存储空间,有点像如果那里有 union
。如果只分配了 4 个字节(仅用于 int
,而不是数组),那么 i[4]
访问将覆盖某些内容或不太可能导致段错误。) .
25185
是 0x6261
,假设小端架构对应 {0x61, 0x62, 0x00, 0x00}
,即,{'a', 'b', 0, 0 }
。 'e'
不包含在该数字中,因为您的体系结构的 int
有 4 个字节大,而 'e'
放在第 5 个字节。
同样,您处于 UB 领域,因此 none 这是有保证的行为。
当我遇到这种情况时,我正在测试范围和可见性我找不到解释:
我有两个 .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);
}
当我编译并 link 它们来创建我启动的可执行文件时,结果如下:
i(主1)=1
i (修改) = a
j(修改)= 0
i(主2)=25185
这是怎么回事?我会改变类型吗?给出一个大小的数组是否会超过 F1.c 中 i 的声明?
谢谢!
这违反了 C 的规则。外部全局变量需要有一致的声明。 (这就是我们使用 headers 来保持一致性的原因。)您已授权您的工具集将事情搞得一团糟。
也就是说,您的情况是 objects 只是重叠(可能为 int
和 char[10]
分配了足够的存储空间,有点像如果那里有 union
。如果只分配了 4 个字节(仅用于 int
,而不是数组),那么 i[4]
访问将覆盖某些内容或不太可能导致段错误。) .
25185
是 0x6261
,假设小端架构对应 {0x61, 0x62, 0x00, 0x00}
,即,{'a', 'b', 0, 0 }
。 'e'
不包含在该数字中,因为您的体系结构的 int
有 4 个字节大,而 'e'
放在第 5 个字节。
同样,您处于 UB 领域,因此 none 这是有保证的行为。