我想在函数中修改指针的值,但是我不明白为什么该示例有效。
#include<stdio.h>
void foo (int **p);
int main()
{
int i=97;
int *p = &i;
foo(&p);
printf("%d",*p);
return 0;
}
void foo (int **p)
{
int j=2;
*p = &j;
printf("%d",**p);
}
输出为2 2,但是如果j不再存在,怎么可能 在主要? p指向什么? 我本以为在第二次打印p(在主目录中)的值时会有垃圾。
答案 0 :(得分:4)
取消引用指向无效对象的指针(例如,指向具有超出范围的自动存储持续时间的对象)的是未定义行为(例如,this在线C标准草案):
3.4.3
1 未定义的行为行为(使用不可移植或错误的行为) 程序结构或错误数据,本国际 标准没有任何要求
2注意可能的不确定行为包括忽略情况 完全具有不可预测的结果,可以在翻译过程中表现 或以书面形式记录程序执行 环境(带有或不带有诊断消息), 终止翻译或执行(签发 诊断消息)。
因此,未定义的行为意味着可能会发生任何事情,即使它像您的情况一样“按预期工作”。但是,您一定不能依靠这种行为。