C语言 为什么这些指针函数有不同的输出

omvjsjqw  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(144)

这些代码在功能上看起来是一样的,但是它们有不同的输出;

#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;
}

输出不良
因为它们都是调用一个指向一个指针的指针,引用这个指针并修改它,它们在功能上应该是相同的,但它们不是。

dgjrabp2

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

yfjy0ee7

yfjy0ee72#

第一个代码使用的是“a”(&a)的地址,它是堆栈上的参数或堆栈地址,而第二个代码是正确的。
希望能帮上忙。

相关问题