在函数中更改指针的值

时间:2019-02-05 14:06:18

标签: c pointers

我想在函数中修改指针的值,但是我不明白为什么该示例有效。

#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(在主目录中)的值时会有垃圾。

1 个答案:

答案 0 :(得分:4)

取消引用指向无效对象的指针(例如,指向具有超出范围的自动存储持续时间的对象)的是未定义行为(例如,this在线C标准草案):

  

3.4.3

     

1 未定义的行为行为(使用不可移植或错误的行为)   程序结构或错误数据,本国际   标准没有任何要求

     

2注意可能的不确定行为包括忽略情况   完全具有不可预测的结果,可以在翻译过程中表现   或以书面形式记录程序执行   环境(带有或不带有诊断消息),   终止翻译或执行(签发   诊断消息)。

因此,未定义的行为意味着可能会发生任何事情,即使它像您的情况一样“按预期工作”。但是,您一定不能依靠这种行为。