一个标准的 C 语言程序的执行从 main 函数开始。

(图片来源网络,侵删)
详细解释
核心答案:main 函数
在 C 语言标准中,程序的入口点(entry point)是一个名为 main 的特殊函数,当操作系统加载并执行你的 C 程序时,它会首先找到并调用这个 main 函数。
所有在 main 函数中定义的代码,都会按照从上到下的顺序依次执行,当 main 函数执行完毕并返回时,整个 C 程序也就结束了。
main 函数的标准形式
main 函数通常有以下两种标准形式:
不接收命令行参数 这是最常见的形式,当你的程序不需要在启动时接收外部参数时使用。

(图片来源网络,侵删)
int main(void) {
// 程序的主要逻辑代码写在这里
printf("Hello, World!\n");
return 0; // 程序正常结束,返回 0
}
接收命令行参数
当你的程序需要从命令行接收参数时使用(gcc myprogram.c -o myprogram 中的 myprogram 和 myprogram.c 就是参数)。
int main(int argc, char *argv[]) {
// argc: argument count (参数个数)
// argv: argument vector (参数向量,即字符串数组)
// 程序的主要逻辑代码写在这里
printf("程序启动,共接收到 %d 个参数,\n", argc);
for (int i = 0; i < argc; i++) {
printf("参数 %d: %s\n", i, argv[i]);
}
return 0; // 程序正常结束,返回 0
}
int main() 的说明:
在一些旧的代码或非标准的编译器中,你可能会看到 void main() 或 main()。但这在标准的 C 语言中是不推荐的,甚至是错误的。
int表示main函数执行完毕后会返回一个整数值给操作系统。- 返回值
0通常表示程序成功执行,没有发生错误。 - 返回非零值(如
1,-1等)通常表示程序在执行过程中遇到了某种错误或异常。
一个完整的示例
下面是一个完整的 C 程序,清晰地展示了执行流程。
#include <stdio.h> // 包含标准输入输出库,以便使用 printf 函数
// 1. 程序首先从这里开始执行吗?不是!
// 首先执行的是预处理指令,#include,它会将 stdio.h 的内容粘贴到这里。
// 全局变量(如果有的话)会被初始化。
// 2. 程序会进入 main 函数
int main(void) {
printf("程序开始执行,进入 main 函数,\n");
// 3. main 函数中的代码按顺序执行
int a = 10;
int b = 20;
int sum = a + b;
printf("计算结果: %d + %d = %d\n", a, b, sum);
printf("main 函数即将执行完毕,准备返回,\n");
// 4. 程序执行到这里,准备结束
// return 0; 将值 0 返回给操作系统,表示程序成功结束。
return 0;
}
执行流程总结:

(图片来源网络,侵删)
- 预处理:处理
#include等以 开头的指令。 - 编译:将代码翻译成机器指令。
- 链接:将你的代码和所需的库函数链接在一起,生成可执行文件。
- 运行:操作系统加载可执行文件,找到
main函数的入口地址,并开始执行main函数体内的代码。 - 结束:当
main函数执行到return语句或函数体末尾时,程序终止,并将返回值传递给操作系统。
重要补充:main 函数之前的代码?
你可能会问:“那 #include 和全局变量声明不是在 main 函数之前吗?它们什么时候执行的?”
这是一个非常好的问题,我们需要区分“程序执行”和“程序编译/加载”的过程。
-
编译和链接阶段(程序运行前):
- 预处理:
#include <stdio.h>会在编译前被处理,stdio.h文件的内容会被直接插入到这个位置。 - 全局变量初始化:在
main函数被调用之前,程序会进入一个特殊的启动阶段(由 C 运行时库 - CRT 负责),在这个阶段,所有在函数外部声明的全局变量和静态变量会被初始化(自动初始化为 0,或者在声明时指定了初始值则使用指定的值)。
- 预处理:
-
程序执行阶段(从
main开始):- 启动阶段结束后,程序的“逻辑执行”才真正从
main函数的第一行代码开始。 - 在
main函数内部声明的局部变量,只有在执行到它们的声明语句时才会被创建和初始化。
- 启动阶段结束后,程序的“逻辑执行”才真正从
示例:
#include <stdio.h>
// 这是一个全局变量
int global_var = 100;
int main(void) {
// 这是一个局部变量
int local_var = 50;
printf("全局变量的值: %d\n", global_var); // 输出 100
printf("局部变量的值: %d\n", local_var); // 输出 50
return 0;
}
在这个例子中,global_var 会在 main 函数被调用之前就已经被初始化为 100,而 local_var 只有当程序执行到 int local_var = 50; 这一行时才会被创建并赋值为 50。
| 概念 | 描述 |
|---|---|
| 程序入口点 | main 函数 |
| 执行起点 | main 函数的第一行可执行代码 |
| 执行终点 | main 函数执行完毕(遇到 return 语句或函数体末尾) |
| 返回值 | int 类型,0 表示成功,非 0 表示错误 |
| 全局变量 | 在 main 函数之前的启动阶段被初始化 |
| 局部变量 | 在 main 函数内部,执行到其声明语句时被初始化 |
记住这个核心原则:对于 C 语言程序的逻辑执行流程来说,一切的开始和结束都与 main 函数紧密相连。
