如何将指针作为函数参数返回

16

我试图从函数参数中返回数据指针:

bool dosomething(char *data){
    int datasize = 100;
    data = (char *)malloc(datasize);
    // here data address = 10968998
    return 1;
}

但是当我以以下方式调用函数时,数据的地址会变为零:

char *data = NULL;
if(dosomething(data)){
    // here data address = 0 ! (should be 10968998)
}

我做错了什么?


1
你真的在使用C语言还是在使用C++(一些评论表明你谈论了C++引用)? - Johannes Schaub - litb
1
我没有将它标记为C++,因为我不知道这很重要,而且人们经常抱怨“那不是C++,那是C”,因为我正在使用malloc()函数... - Rookie
2个回答

29
您正在按值传递参数。dosomething修改的是其本地副本中的data - 调用者将永远无法看到它。
请使用以下代码:
bool dosomething(char **data){
    int datasize = 100;
    *data = (char *)malloc(datasize);
    return 1;
}

char *data = NULL;
if(dosomething(&data)){
}

哦该死...我明白了,一个指向指针的指针...但是没有其他方法可以做到这一点吗?我见过那些在参数中没有&的函数,有可能将我的函数转换为那种方式工作吗?(我喜欢没有&,因为它不容易出错) - Rookie
你可以使用 char * dosomething(char *) 并返回新指针。 - Erik
但我想从函数中返回bool值,我的意思是是否可以调用函数dosomething(data)而不是dosomething(&data)?也许在C++中可以实现? - Rookie
3
在C++中,如果可以的话,请使用bool dosomething(char* &data)来进行传递引用。 - Erik
在这种情况下,调用者有责任释放指针吗?(删除数据或类似操作)? - BadPirate
@BadPirate 是的,它必须释放指针中地址处的内存。 - Joe McGrath

2
int changeme(int foobar) {
  foobar = 42;
  return 0;
}

int  main(void) {
  int quux = 0;
  changeme(quux);
  /* what do you expect `quux` to have now? */
}

对于你的代码片段也是同样的情况。

C语言中所有内容都是按值传递。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接