You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:31:38