【问题标题】:Can I change an initialized char pointer via function?我可以通过函数更改初始化的字符指针吗?
【发布时间】:2017-01-07 21:30:28
【问题描述】:

这是我的main.c

#include <stdio.h>

void changeStuff(char *stuff){
    stuff=  "Hello everyone";
}

int main(int argc, char **argv) {
    char *stuff;
    changeStuff(stuff);
    printf(stuff);
    return 0;
}

当我构建这个时,我收到了这个警告:

warning: ‘stuff’ is used uninitialized in this function [-Wuninitialized]

当我运行这个程序时,什么都没有打印出来。

由于在声明后似乎无法定义没有值的char*,如何更改传递给函数的char* 的值?

【问题讨论】:

  • 不,您只是更改了传递的指针的本地副本,这将被遗忘。
  • C 使用按值传递。 f(x) 无法更改 x

标签: c pointers


【解决方案1】:

在 C 中,函数参数是按值传递的。为了修改一个指针值,你需要给指针传递一个指针,比如:

#include <stdio.h>

void changeStuff(char **stuff){
    *stuff=  "Hello everyone";
}

int main(int argc, char **argv) {
    char *stuff;
    changeStuff(&stuff);
    printf("%s\n", stuff);
    return 0;
}

请注意,将用户定义的值直接传递给printf() 并不是一个好主意。见:How can a Format-String vulnerability be exploited?

【讨论】:

  • 一个问题。通过引用传递——&stuff——与将指针传递给指针一样吗?
  • C 中没有传递引用(仅在 C++ 中)
  • C 根本没有通过引用传递。 &amp;stuff 仍然是按值传递的(除了你可以使用该值来修改它的指针)。
  • 啊,是地址传递。在这种情况下,char **stuff&amp;stuff所代表的内容有区别吗?
  • char *stuff 是一个指针。 &amp;stuff 是指针本身的地址。 char **stuff 是指向指针的指针。该函数写入*stuff,因此它更改了指针,因为它传递了一个指针的地址
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 2022-01-09
  • 2010-12-12
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多