C中具有不同类型的外部变量

问题描述 投票:2回答:1

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

我有两个.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 casting declaration extern linkage
1个回答
2
投票

这违反了C的规则。外部全局变量需要具有一致的声明。 (这就是为什么我们使用标题来保持一致性的原因。)您已授予工具集处理麻烦的权限。

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

251850x6261,假设小端架构对应于{0x61, 0x62, 0x00, 0x00},即{'a', 'b', 0, 0 }。该数字中不包含'e',因为您的体系结构的int长4个字节,'e'放在第5个字节。

同样,您处于UB领域,所以没有一个可以保证的行为。

© www.soinside.com 2019 - 2024. All rights reserved.