📅  最后修改于: 2023-12-03 15:23:22.812000             🧑  作者: Mango
在C语言中,程序在执行main()之前和之后可能会执行一些函数。这些函数在程序开始执行之前或者执行之后完成一些特殊的操作,例如初始化全局变量或者清理内存。接下来,我们将介绍这些在C中main()之前和之后执行的函数。
在C中,程序在执行main()之前会首先执行以下两个函数:
静态变量是在程序的数据区分配存储空间。如果没有显式初始化,那么变量默认会被设置为0或者NULL,例如以下代码:
int i; // 默认值为0
char *p; // 默认值为NULL
如果你显式初始化了一个变量,那么它的默认值将被覆盖。例如:
int i = 1; // i的值为1
char *p = "hello"; // p指向字符串"hello"
同时,在整个程序的生命周期中,静态变量都会存在于内存中,如果没有赋值,那么它的值就是0或NULL。静态初始化程序会在main()函数执行之前完成。
在C++中,类可以有构造函数,用于对象的初始化。在程序运行之前,构造函数先于main()函数执行。因此,在程序启动时,主要执行的是静态全局对象的初始化,其次是调用了通过__attribute__((constructor))属性修饰的函数(即构造函数)。
在程序执行完main()函数之后,会执行这些函数:
atexit()函数用于注册在程序退出时需要执行的函数。可以注册多个函数,这些函数将按照注册的顺序逆序执行。因此,最后注册的函数最先执行,第一个注册的函数最后执行。
这是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
void function1(void)
{
printf("This is function 1.\n");
}
void function2(void)
{
printf("This is function 2.\n");
}
int main()
{
atexit(function1);
atexit(function2);
printf("Inside main()\n");
return 0;
}
输出:
Inside main()
This is function 2.
This is function 1.
在C中,程序在执行main()函数之前和之后会执行一些函数。在程序启动时,将执行静态初始化和构造函数。在程序终止时,将执行atexit()函数和析构函数。对于大型复杂的程序,这些函数可以用于执行初始化和清理工作,从而简化代码的复杂度。