下面的代码片段给出了输出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;
}
答案 0 :(得分:6)
当foo()
退出时,*p
指向不再存在的变量。因此,您正在调用未定义的行为。
答案 1 :(得分:5)
您指向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;
}
它并不漂亮,但出于教育目的,它可能会很好。