静态与Malloc

Cow*_*Zow 7 c malloc memory-management

块范围中的static关键字与使用malloc相比有什么优势?

例如:

功能A:

f() {
    static int x = 7;
}
Run Code Online (Sandbox Code Playgroud)

功能B:

f() {
    int *x = malloc(sizeof(int));
    if (x != NULL)
        *x = 7;
}
Run Code Online (Sandbox Code Playgroud)

如果我正确理解这一点,两个程序都会创建一个存储在堆上的整数7.在A中,变量在主方法执行之前在某个永久存储器的最开始创建.在B中,一旦调用函数,就在现场分配内存,然后在指针指向的位置存储7.在什么类型的情况下,您可以使用一种方法而不是另一种方法?我知道你不能在函数A中释放x,所以不会使B一般更优选吗?

Alo*_*ave 6

两个程序都创建一个integer 7存储在堆上的程序

不,他们没有.
static创建一个具有静态存储持续时间的对象,该持续存储持续时间在程 动态分配的对象(由其创建malloc)保留在内存中,直到被显式删除free.两者都提供不同的功能 static维护函数调用中对象的状态,而动态分配的对象则不维护.

在什么类型的情况下,您可以使用一种方法而不是另一种方法?

您可以使用static,当你希望对象是整个程序的生存活着,内函数调用保持其状态.如果您在多线程环境中工作,static则将为所有线程共享相同的对象,因此需要同步.

您可以使用malloc,当你明确地想要控制的object.for如寿命:确保对象活得足够长,直到的函数调用的函数调用后访问它(自动/本地对象将会被释放,一旦范围{ }的功能结束).除非调用者显式调用free已分配的内存,否则直到操作系统在程序退出时回收它.