下面的代码片段给出了输出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;
}发布于 2014-01-02 09:47:47
当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;
}它不是美丽的,但为了教育目的,它可以是好的。
发布于 2014-01-02 09:48:14
当foo()退出时,*p指向一个不再存在的变量。因此,您正在调用未定义的行为。
https://stackoverflow.com/questions/20880084
复制相似问题