【发布时间】:2020-12-04 15:58:24
【问题描述】:
当指向指针变量(双指针)的指针在初始化后递增时,如果我们访问它的值会给出运行时错误。而在指针变量的情况下,如果我们在递增后访问它的值会给出垃圾值。我正在努力理解这种行为的可能原因是什么?
使用双指针:
#include<stdio.h>
int main(void)
{
int i=10;
int *j=&i;
int **k=&j;
k++;
printf("%d ",**k);
return 0;
}
输出:运行时错误
使用单指针:
#include<stdio.h>
int main(void)
{
int i=10;
int *j=&i;
j++;
printf("%d ",*j);
return 0;
}
输出:垃圾值
【问题讨论】:
-
第二种情况是垃圾值,第一种情况是垃圾地址。当您取消引用 that 时,它会很痛。它们都是未定义的行为,所以任何事情都可能发生。
-
@WeatherVane 您之所以说这是未定义的行为,是因为我们正在访问两个程序的未初始化内存。我说的对吗?
-
这是未定义的行为,主要是因为取消引用不在原始对象内的地址是非法的,无论它是否以某种方式初始化。在第一种情况下,result 是访问不允许的内存。在第二种情况下,它是垃圾。