这些代码在功能上看起来是一样的,但是它们有不同的输出;
#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;
}
产出良好
#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;
}
输出不良
因为它们都是调用一个指向一个指针的指针,引用这个指针并修改它,它们在功能上应该是相同的,但它们不是。
2条答案
按热度按时间dgjrabp21#
根据C 2017 6.5.2.2:
在准备调用函数时,会对参数进行求值,并将相应参数的值赋给每个参数。
1.函数可以更改其参数的值,但这些更改不会影响参数的值。另一方面,可以传递一个指向对象的指针,函数可能会改变所指向对象的值。
也称为“按值调用”。这通常是通过将计算的参数压入堆栈来实现的。
在第一个例子中,我们推变量
main:a
的值,关键是这意味着main:a != change_ptr:*(&a)
和change_ptr:a
是不同的变量。change_ptr:a
的生命期在函数返回时结束,这就是为什么外部不会看到对它的任何更改。在第二个例子中,我们正在推送
&a
的地址,现在是main:a == change_ptr:*a
。yfjy0ee72#
第一个代码使用的是“a”(&a)的地址,它是堆栈上的参数或堆栈地址,而第二个代码是正确的。
希望能帮上忙。