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