gpt4 book ai didi

c - C 中不同类型的外部变量

转载 作者:行者123 更新时间:2023-12-02 09:04:45 25 4
gpt4 key购买 nike

当我遇到这种情况时,我正在测试范围和可见性,但我找不到解释:

我有两个 .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(主 1)= 1

i(修改)= a

j(修改)= 0

i(主 2)= 25185

发生了什么事?我会改变类型吗?给定一个大小的数组是否会压倒 F1.c 中 i 的声明?

谢谢!

最佳答案

这违反了 C 语言的规则。外部全局变量需要具有一致的声明。 (这就是我们使用 header 来保持一致性的原因。)您已经允许您的工具集将事情弄得一团糟。

话虽这么说,在您的情况下发生的情况是对象只是重叠(可能为 intchar[10] 分配了足够的存储空间,有点像那里有一个 union 。如果仅分配了 4 个字节(仅分配给 int ,而不是数组),然后 i[4] 访问将覆盖某些内容或不太可能导致段错误。)。

251850x6261 ,假设采用小端架构,对应于 {0x61, 0x62, 0x00, 0x00} ,即;,{'a', 'b', 0, 0 }'e'不包含在该数字中,因为您的架构的 int s 有 4 个字节大, 'e'被放在第 5 个字节。

再说一遍,您处于 UB 领域,因此所有这些都不是保证的行为。

关于c - C 中不同类型的外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59913960/

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