char * 在 C 中指向函数的变量时给出垃圾值

问题描述 投票:0回答:2

当我将指针传递给函数,然后将指针更改为内存的另一个位置时,我会得到 SIGSEV 或垃圾值。哪里有代码可以证明:

#include <stdio.h>

void fn(char *n) {
  /*
   * imagine this variable 'b' is
   * a part of a structure of
   * some library
   */
  char *b = "hello, world!";

  n = b;
}

int main() {
  char *a = NULL;
  fn(a);

  /* it throws garbage or SIGSEV */
  printf("%s\n", a);
}

我知道这个问题的原因是什么。函数

fn
在调用时会创建变量
b
,但当
fn
结束时,
b
会被删除。因此,
a
指向程序不拥有的内存。我该怎么做才能修复这个程序。我知道,我可以通过使用 C++ 及其 std::string 来解决这个问题。但我必须用C来做。 谢谢。

c string pointers
2个回答
0
投票

这意味着你需要将main中定义的指针a通过引用传递给函数fn。在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,解除传递的指针后,函数将可以直接访问指针指向的对象并可以更改它。

void fn(char **n) {
  /*
   * imagine this variable 'b' is
   * a part of a structure of
   * some library
   */
  char *b = "hello, world!";

  *n = b;
}

在main中你需要写

fn( &a );

0
投票

您想要修改

n
值本身,而不是它指向的数据。

所以

  • fn
    原型应该是
    void fn(char ** n)
  • 作业应该是
    *n = b
    或更好
     n* = strddup (...);
  • 电话应该是
    fn(&a);
© www.soinside.com 2019 - 2024. All rights reserved.