Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 更改指针';函数中的s值_C_Pointers - Fatal编程技术网

C 更改指针';函数中的s值

C 更改指针';函数中的s值,c,pointers,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); }

我想修改函数中指针的值,但我不明白这个例子为什么有效

#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);
}
#包括
无效foo(int**p);
int main()
{
int i=97;
int*p=&i;
foo&p;
printf(“%d”,*p);
返回0;
}
无效foo(整数**p)
{
int j=2;
*p=&j;
printf(“%d”,**p);
}
输出是2,但是如果j不存在了怎么可能呢 基本上?p指的是什么?
我本以为在第二次打印p值时(主要是)会出现垃圾。

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

3.4.3

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

2注:可能的未定义行为包括忽略情况 完全不可预测的结果,在翻译过程中的行为 或以文件化的方式执行程序 环境(无论是否发出诊断消息),以 终止翻译或执行(通过发布 诊断信息)


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

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

3.4.3

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

2注:可能的未定义行为包括忽略情况 完全不可预测的结果,在翻译过程中的行为 或以文件化的方式执行程序 环境(无论是否发出诊断消息),以 终止翻译或执行(通过发布 诊断信息)


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

未定义的行为就是未定义的行为。仅仅因为它可能是垃圾并不意味着它一定是垃圾。请看一个类似的实验。这是未定义的行为,因为正如你自己所说,它不再“存在”。因此,任何事情都有可能发生;甚至达到了预期的效果。可能发生的情况是,它只是试图读取给定的(无效)内存位置,如果它没有对其执行任何其他操作,原始值可能仍然存在。很好的说明我曾经在生产代码中遇到过类似的错误,函数返回了指针。它“有效”了好几年。当我在函数调用(跟踪一个不相关的bug)后添加一个
printf
语句时,它就被发现了,该语句破坏了堆栈和剩余值。未定义的行为非常类似于在铁路轨道上玩。你试试看,一切都很好。有一天,它不是。未定义的行为是未定义的。仅仅因为它可能是垃圾并不意味着它一定是垃圾。请看一个类似的实验。这是未定义的行为,因为正如你自己所说,它不再“存在”。因此,任何事情都有可能发生;甚至达到了预期的效果。可能发生的情况是,它只是试图读取给定的(无效)内存位置,如果它没有对其执行任何其他操作,原始值可能仍然存在。很好的说明我曾经在生产代码中遇到过类似的错误,函数返回了指针。它“有效”了好几年。当我在函数调用(跟踪一个不相关的bug)后添加一个
printf
语句时,它就被发现了,该语句破坏了堆栈和剩余值。未定义的行为非常类似于在铁路轨道上玩。你试试看,一切都很好。有一天,它不是。