C语言extern关键字实际测试疑问:多文件编译运行问题咨询
拆解extern关键字测试的程序行为
先把你用到的三个测试源文件清晰列出来:
测试源文件
main.c
#include<stdio.h> extern int var; int main() { var = 10; printf("%d %p",var,&var); var = 20; }
main2.c
#include<stdio.h> extern int var; int main() { printf("%d %p",var,&var); }
other.c
int var;
程序运行的现象与原因分析
首先看你提到的运行结果:编译main.c + other.c得到的程序运行输出10 0x8049660,而编译main2.c + other.c得到的程序运行时,会输出0 0x8049660(地址大概率和前者一致,但值是0)。这里的核心要点有两个:
1. extern关键字的本质
extern int var;是一个变量声明,它告诉编译器:“这个var变量是在其他源文件里定义的,你编译时先别报错,链接的时候去找到它的定义就行”。而other.c里的int var;是变量定义,会在程序的数据段(.bss区,未初始化全局变量的存储区域)分配内存,并且操作系统会自动把未初始化的全局变量初始化为0。
2. 进程的独立性是关键
你两次运行的是两个独立的程序(或者说同一个程序的两次独立运行),操作系统会为每个进程分配独立的虚拟地址空间:
- 第一次运行的进程里,你把
var设为10,又改成20,但这个进程结束后,操作系统会回收它占用的所有内存,var的值不会被保留下来。 - 第二次运行的进程是全新的,它的
var是重新在自己的虚拟地址空间里分配的(所以虚拟地址看起来和第一次一样,这是因为程序的链接布局相同,虚拟地址是固定的),但这个新的var作为未初始化全局变量,会被操作系统初始化为0,所以输出的值是0。
如果想让两个程序共享变量的值,那得用进程间通信机制(比如共享内存、文件存储等),extern只能解决同一个程序内部不同源文件之间的变量共享问题,跨进程是行不通的哦。
内容的提问来源于stack exchange,提问作者Arnab Bhattacharjee
相关产品推荐
相关产品推荐

