Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当在函数中使用malloc作为静态指针时?_C_Pointers_Static - Fatal编程技术网

当在函数中使用malloc作为静态指针时?

当在函数中使用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

我不明白为什么在下面的代码片段中,程序员使用了一个静态变量(因此我开始怀疑自己的知识):

在main()中,在循环中多次调用func:

int main() {

    for (i = 0; i < N; ++i)
        x = func(...);

}
intmain(){
对于(i=0;i
对func的第一次调用将变量temp初始化为NULL,从而分配temp(根据这一点,初始化可能也是冗余的)

函数func对temp不做任何特殊处理,只要在满足条件的情况下从另一个(全局)数组复制一些值到它,并返回写入的元素数

如果我理解正确,malloc在堆中分配内存,因此在显式释放内存之前,内存将是持久的,并且由于指针是静态的,因此可以在后续调用中访问它

然后是问题:

  • 我理解正确吗
  • 这是这种方法的优点,而不是malloc temp 在func之外,然后显式地将其传递给func?我猜是这样 视情况而定,好吧,但也许有一个众所周知的 我也看到了这一点,但我无法理解其中的含义 第一个例子的有用性
  • 我必须在func中释放temp(在最后一步,顺便说一句,这不是在这段代码中完成的)
  • 我需要修改上面的代码(这要复杂得多),我更喜欢在func外部分配temp,然后将其传递给函数,我想确保我没有遗漏一些重要的东西。顺便说一下,我想我可以学到一些东西:)

    谢谢

  • 既然我们在C,而不是C++,我想这是一种尝试限制分配内存的所有权和管理的方法,这样被调用方就不必关心了。将指针扩展到管理它的一个函数之外是否有好处
  • 对。除非您打算缓存该数据或保留该数据直到程序终止
  • 我理解正确吗

    这种方法的优点是什么,而不是在func外部使用malloc temp,然后显式地将其传递给func

    在一种情况下,每个调用方必须知道
    temp
    及其对
    func
    的正确初始化,使调用方与
    func
    紧密耦合。如果将来任何时候需要更改
    temp
    数组的类型或大小,则每个调用者都会受到影响。在另一种情况下,所有这些都被抽象掉了

    我必须释放函数中的临时值

    temp
    在程序的整个生命周期中使用。如果在函数结束时释放它,则无法达到其目的,即减少对
    malloc
    的调用次数和/或在调用之间保留数据。如果你能找到一种方法,你可以在节目结束时释放它。如果在函数末尾释放它,则不需要它是静态的,也不需要
    If(temp==NULL)
    test。你没有理由问这个问题

  • 我理解正确吗
  • 是的,你知道

  • 这种方法的优点是什么,而不是在func外部使用malloc temp,然后显式地将其传递给func?我想这取决于环境,好吧,但也许有一个众所周知的例子。我也看到了这个答案,但我无法理解第一个例子的用处
  • 优点是函数的调用者不需要知道
    func
    需要缓冲区来实现功能

  • 必须在func中释放temp(在最后一步,顺便说一句,这不是在本代码中完成的)
  • 是的,你应该。不幸的是,按照它的实现方式,您无法做到这一点。无法访问
    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
    }