下面的代码片段给出了输出11 11未定义的值.但是为什么我在第二次执行相同的语句时得到未定义的值?这与函数的范围有什么关系吗?
void foo(int **const p)
{
int j = 11;
*p = &j;
printf("%d ", **p);
}
int main()
{
int i = 10;
int *p = &i;
foo(&p);
printf("%d ", *p);
printf("%d ", *p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当foo()退出,*p指向一个变量不再存在.因此,您正在调用未定义的行为.
您指向一个foo函数返回后已经释放的项目.这是一个错误,然后发生未定义的行为.
变量超出范围后,它不会被自动覆盖,它的值只会保留在那里,直到某些其他指令使用该内存位置来存储另一个值.在该示例中,第一个printf的执行会覆盖p指向的内存位置,这就是为什么当您再次读取它时,您会看到其值已更改.
您可以按如下方式修复它:
void foo(int **const p)
{
int *j = (int *)malloc(sizeof(int));
*p = j;
printf("%d ", **p);
}
int main()
{
int i = 10;
int *p = &i;
foo(&p);
printf("%d ", *p);
printf("%d ", *p);
free(p)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它不漂亮,但出于教育目的,它可能是好的.