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



Bug:
将双指针传递给函数时,指针指向的字段的值似乎依赖于函数的某个局部变量。
更具体地说,当我注释行 L(在函数"函数
"(输出:

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: %dn", (*what)->value == NULL);
}
int main()
{
s** m = initialize();
printf("In the main function: %dn", (*m)->value == NULL);
function(m);
}

我尝试过的:

  • 以为我得到了随机输出,但事实并非如此,因为我始终得到相同的输出。
  • 我尝试破译汇编语言代码,但这对我来说太神秘了。

环境:

  • 编译器:gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
  • 操作系统: Linux Mint

在这里:

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函数返回时,变量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;
}

可以调用未定义的行为,因为它返回指向局部变量的指针。此外,它还有内存泄漏。

首先分配一个内存,其地址被分配给可变 temp

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

然后重新分配指针

temp = &f;

因此,不会释放分配的内存。

指针由局部变量的地址分配

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

退出函数后,变量f将不活动。因此,指针温度的值无效。

似乎你的意思是以下内容

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: %dn", (*what)->value == NULL);
}
int main( void )
{
s** m = initialize();
printf("In the main function: %dn", (*m)->value == NULL);
function(m);
free( *m );
free( m );
}

程序输出为

In the main function: 1
In the function: 1

相关内容

  • 没有找到相关文章

最新更新