当我将指针传递给函数,然后将指针更改为内存的另一个位置时,我会得到 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来做。
谢谢。
这意味着你需要将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 );
您想要修改
n
值本身,而不是它指向的数据。
所以
fn
原型应该是void fn(char ** n)
*n = b
或更好 n* = strddup (...);
fn(&a);