将双指针传递给 C 中的函数时出现奇怪的错误

Weird bug while passing double pointers to a function in C

错误:
在将双指针传递给函数时,指针指向的字段的值似乎取决于函数的某个局部变量。
更具体地说,当我评论行 L(在函数“function”中)
Output:

In the main function: 1
In the function: 1

但是当我取消注释同一行时,
输出:

In the main function: 1
In the function: 0

程序:

typedef struct s{
    int *value; 
}s;


s** initialize()
{
    s** temp = (s**)malloc(sizeof(s*));
    s* f = (s*)malloc(sizeof(s));
    f->value = NULL;
    temp = &f;
    return temp;
}

void function(s** what)
{

//Line L:   size_t count = 0;
    printf("In the function: %d\n", (*what)->value == NULL);
}

int main()
{
    s** m = initialize();
    printf("In the main function: %d\n", (*m)->value == NULL);
    function(m);
}

我尝试过的:

环境:

这里:

s** initialize()
{
    s** temp = (s**)malloc(sizeof(s*));
    s* f = (s*)malloc(sizeof(s));
    f->value = NULL;
    temp = &f;          // temp is now the address of a local variable
    return temp;        // now temp is returned
                        // that's undefined behavior when the returned
                        // pointer is used
}

initialize 函数 returns 时,变量 f 不存在,因此您返回的是一个不存在的变量的地址。使用该地址将是未定义的行为,即任何事情都可能发生,并且通常无法解释它。

在具体的系统上,我们可以做一些猜测。我的猜测是,一旦您添加带有新变量的行,它就会覆盖用于存储 f 的内存位置。如果没有新变量,f 用于存储的位置仍然相同。

函数initialize

s** initialize()
{
    s** temp = (s**)malloc(sizeof(s*));
    s* f = (s*)malloc(sizeof(s));
    f->value = NULL;
    temp = &f;
    return temp;
}

可以调用未定义的行为,因为它 returns 指向局部变量的指针。而且它有内存泄漏。

首先分配了一块内存,并将其地址赋给了变量temp

    s** temp = (s**)malloc(sizeof(s*));

然后指针被重新赋值

    temp = &f;

所以分配的内存没有被释放。

指针由局部变量的地址赋值

    s* f = (s*)malloc(sizeof(s));
    //...
    temp = &f;

退出函数后变量f将不存在。所以指针 temp 有一个无效值。

看来你的意思是下面的

s** initialize()
{
    s** temp = (s**)malloc(sizeof(s*));
    s* f = (s*)malloc(sizeof(s));
    f->value = NULL;
    *temp = f;
    return temp;
}

如果进行更改,您将获得预期的结果。

#include <stdio.h>
#include <stdlib.h>

typedef struct s{
    int *value; 
}s;

s** initialize()
{
    s** temp = (s**)malloc(sizeof(s*));
    s* f = (s*)malloc(sizeof(s));
    f->value = NULL;
    *temp = f;
    return temp;
}

void function(s** what)
{

//Line L:   size_t count = 0;
    printf("In the function: %d\n", (*what)->value == NULL);
}

int main( void )
{
    s** m = initialize();
    printf("In the main function: %d\n", (*m)->value == NULL);
    function(m);

    free( *m );
    free( m );
}

程序输出为

In the main function: 1
In the function: 1