【发布时间】:2023-04-07 12:00:02
【问题描述】:
当我编写以下程序时:
文件 1:
#include <stdio.h>
int global;
void print_global1() {
printf("%p\n", &global);
}
文件 2:
#include <stdio.h>
char global;
void print_global2() {
printf("%p\n", &global);
}
文件 3:
void print_global1();
void print_global2();
int main()
{
print_global1();
print_global2();
return 0;
}
输出:
$ ./a.out
0x804a01c
0x804a01c
这是我的问题:
- 为什么链接器将“int global”和“char global”实现为同一个全局变量:
- 编译器怎么不报错(不是
-Wall -Wextra -ansi的最小警告...) - 全局变量的大小如何管理(int和char的大小不同)
PS:第二个问题是体系结构/编译器相关的,所以让我们以 int 大小为 32 位的 gcc 或 Visual C++(用于 C)为例
编辑:这不是 C++ 的问题,而是 C 的问题!
我使用 gcc 版本 4.4.1 和 Ubuntu 9.10,这是编译控制台输出:
$ ls
global_data1.c global_data2.c global_data.c
$ gcc -Wall -Wextra -ansi global_data*.c
$ ./a.out
0x804a01c
0x804a01c
or
$ gcc -Wall -Wextra -ansi -c global_data*.c
$ gcc -Wall -Wextra -ansi global_data*.o
$ ./a.out
0x804a01c
0x804a01c
【问题讨论】:
标签: c variables compiler-construction global-variables