一个C语言程序总是从 main 函数开始执行。

(图片来源网络,侵删)
更准确地说,程序是从 main 函数的第一条可执行语句开始执行的。
详细解释
标准答案:main 函数
这是C语言标准的规定,无论你的程序有多大、多复杂,包含多少个自定义函数,操作系统在加载并执行你的程序时,都会首先找到并调用名为 main 的函数。
main 函数是整个程序的入口点。
main 函数的原型
main 函数有几种标准的形式,最常见的是以下两种:

(图片来源网络,侵删)
a) 不带参数的 main 函数
这是最简单的形式,当程序不需要接收任何命令行参数时使用。
int main(void) {
// 程序的主要逻辑从这里开始
printf("Hello, World!\n");
return 0; // 正常结束,返回0
}
b) 带参数的 main 函数
这种形式允许程序接收来自命令行的参数。
int main(int argc, char *argv[]) {
// argc: 参数计数器,表示传递给程序的参数个数(包括程序名本身)
// argv: 参数向量,是一个字符串数组,存放了所有的参数
printf("程序名称: %s\n", argv[0]);
printf("参数总数: %d\n", argc);
for (int i = 1; i < argc; i++) {
printf("参数 %d: %s\n", i, argv[i]);
}
return 0;
}
main 函数的返回值:
main函数的返回类型通常是int(整数)。- 返回值
0表示程序成功执行完毕。 - 返回任何非零值通常表示程序遇到了某种错误或异常,在Linux/Unix系统中,这个返回值可以被父进程或脚本(如 变量)捕获。
- 在C99标准之前,
void main()也被一些编译器接受,但这并不是标准写法,不推荐使用。
执行流程图
下面是一个典型的C程序执行流程,可以让你更清晰地理解程序的执行路径:

(图片来源网络,侵删)
graph TD
A[操作系统加载程序] --> B{查找 main 函数};
B --> C[执行 main 函数中的代码];
C --> D{调用其他函数?};
D -- 是 --> E[跳转到被调用的函数];
E --> F[执行被调用函数的代码];
F -- 返回 --> C;
D -- 否 --> G{main 函数执行完毕};
G --> H[执行 return 语句];
H --> I[将返回值返回给操作系统];
I --> J[程序结束];
一个重要的误区:全局变量和 main 之前的代码
很多人会误以为全局变量的初始化或其他代码会在 main 函数之前执行,这在某种程度上是正确的,但顺序很重要。
让我们看一个例子:
#include <stdio.h>
int global_var = 10; // 全局变量
// 这是一个函数,不是 main 函数
void before_main() {
printf("这个函数在 main 之前被调用了吗?\n");
}
int main() {
printf("main 函数开始执行,\n");
printf("global_var 的值是: %d\n", global_var);
printf("Hello, World!\n");
return 0;
}
运行结果:
main 函数开始执行。
global_var 的值是: 10
Hello, World!
你会发现,before_main 函数里的代码并没有被执行,这说明程序并不是从源文件的第一行代码开始执行的。
全局变量 global_var 是什么时候初始化的呢?
根据C标准,在进入 main 函数之前,程序会执行一个“启动代码”(Startup Code),这个启动代码是由编译器提供的,它负责做两件重要的事:
- 初始化所有全局变量和静态变量(将
global_var初始化为10)。 - 调用
main函数。
正确的执行顺序是:
- 启动代码 运行。
- 全局变量
global_var被初始化为 10。 - 调用
main函数。 main函数中的代码开始执行。
- 核心答案:一个C语言程序总是从
main函数开始执行。 main函数是程序的入口点,是操作系统调用的第一个用户定义的函数。- 执行顺序:程序首先由启动代码(由编译器提供)进行初始化(如初始化全局变量),然后启动代码会调用
main函数,main函数中的代码才开始逐行执行。
