为何两个C语言指针函数执行后输出结果存在差异?
两段指针代码输出不同的原因分析
第一段代码及输出
#include <stdio.h> void change_ptr(const char *a){ const char **b = &a; *b = "bad"; } int main(){ const char *a = "good"; change_ptr(a); printf("%s",a); return 0; }
输出结果:
good
第二段代码及输出
#include <stdio.h> void change_ptr(const char **a){ *a = "bad"; } int main(){ const char *a = "good"; change_ptr(&a); printf("%s",a); return 0; }
输出结果:
bad
核心原因解析
两者的本质差异在于函数参数传递方式和指针操作的对象:
第一段代码的问题:
C语言函数参数默认是值传递,调用change_ptr(a)时,会把main里指针a的内容(即"good"的地址)复制一份,作为函数内部的局部参数a。函数里const char **b = &a;取的是这个局部副本指针的地址,后续*b = "bad"修改的只是这个副本的指向,和main里的原指针没有任何关联。函数执行完毕后,局部副本被销毁,main里的原指针仍指向"good",所以输出good。第二段代码的正确逻辑:
函数参数定义为const char **a,调用时传入的是main里原指针a的地址(&a)。此时函数里的*a = "bad",是通过指针的指针直接修改了main中原指针a的指向,让它转而指向"bad"。函数结束后,原指针的修改会保留,因此输出bad。
简单总结:第一段改的是参数副本的指针,第二段改的是原变量的指针。
内容的提问来源于stack exchange,提问作者AGEERRTT
相关产品推荐
相关产品推荐

