当在函数中使用malloc作为静态指针时?
我不明白为什么在下面的代码片段中,程序员使用了一个静态变量(因此我开始怀疑自己的知识): 在main()中,在循环中多次调用func:当在函数中使用malloc作为静态指针时?,c,pointers,static,C,Pointers,Static,我不明白为什么在下面的代码片段中,程序员使用了一个静态变量(因此我开始怀疑自己的知识): 在main()中,在循环中多次调用func: int main() { for (i = 0; i < N; ++i) x = func(...); } intmain(){ 对于(i=0;i关键字表示不同的东西:内部链接,而不是静态持续时间)。唯一的区别是变量的可见性 然而,最终,可见性的选择和变量的供应是设计问题,在某种程度上有多种解决方案 static unsign
int main() {
for (i = 0; i < N; ++i)
x = func(...);
}
intmain(){
对于(i=0;i
对func的第一次调用将变量temp初始化为NULL,从而分配temp(根据这一点,初始化可能也是冗余的)
函数func对temp不做任何特殊处理,只要在满足条件的情况下从另一个(全局)数组复制一些值到它,并返回写入的元素数
如果我理解正确,malloc在堆中分配内存,因此在显式释放内存之前,内存将是持久的,并且由于指针是静态的,因此可以在后续调用中访问它
然后是问题:
temp
及其对func
的正确初始化,使调用方与func
紧密耦合。如果将来任何时候需要更改temp
数组的类型或大小,则每个调用者都会受到影响。在另一种情况下,所有这些都被抽象掉了
我必须释放函数中的临时值
temp
在程序的整个生命周期中使用。如果在函数结束时释放它,则无法达到其目的,即减少对malloc
的调用次数和/或在调用之间保留数据。如果你能找到一种方法,你可以在节目结束时释放它。如果在函数末尾释放它,则不需要它是静态的,也不需要If(temp==NULL)
test。你没有理由问这个问题
func
需要缓冲区来实现功能
temp
外部func
func
由于其实现方式,无法释放它
为了释放在func
中分配的内存,您可以使用以下内容:
static unsigned int *temp = NULL;
void free_temp()
{
free(temp);
}
int func () {
if( temp == NULL ) {
temp = malloc(dim*sizeof(*temp));
// Register free_temp to be called at exit time.
atexit(free_temp);
}
// do stuff with temp
}
我理解正确吗
您正确理解temp
的初始化,这是出于所有实际目的,包括显式初始化器是冗余的。您似乎也正确理解了分配,以及声明temp
的含义static
。实际上,在调用func()
之前,temp
很可能被初始化为NULL
,即使从未调用过它,但程序本身无法分辨它与第一次调用时初始化的不同
这种方法的优点是什么,而不是在func外部使用malloc temp,然后显式地将其传递给func?我想这取决于环境,好吧,但也许有一个众所周知的例子。我也看到了这个答案,但我无法理解第一个例子的用处
大概所需的存储量(由变量dim
控制)在运行时之前是未知的。这就是动态分配的原因
将变量放入函数的局部作用域可以确保它没有链接——它不可见,并且不能从函数之外的任何地方(直接)引用。另一方面,它是由函数本身管理的。其他函数不需要担心为此函数准备数组或将数组传递给它,并且此函数不需要依赖其他任何人来正确设置数组
作为一个文体问题,我倾向于考虑一个静态的文件范围指针(在上下文中,令人困惑的是,<代码>静态< /代码>关键字表示不同的东西:内部链接,而不是静态持续时间)。唯一的区别是变量的可见性
然而,最终,可见性的选择和变量的供应是设计问题,在某种程度上有多种解决方案
static unsigned int *temp = NULL;
void free_temp()
{
free(temp);
}
int func () {
if( temp == NULL ) {
temp = malloc(dim*sizeof(*temp));
// Register free_temp to be called at exit time.
atexit(free_temp);
}
// do stuff with temp
}