在C下通过引用传递指针参数?

Jic*_*hao 8 c c++ pointers reference

#include <stdio.h>
#include <stdlib.h>

void
getstr(char *&retstr)
{
 char *tmp = (char *)malloc(25);
 strcpy(tmp, "hello,world");
 retstr = tmp;
}

int
main(void)
{
 char *retstr;

 getstr(retstr);
 printf("%s\n", retstr);

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc不会编译这个文件,但添加后#include <cstring>我可以使用g ++来编译这个源文件.

问题是:C编程语言是否支持通过引用传递指针参数?如果没有,为什么?

谢谢.

Kir*_*sky 29

不,C不支持引用.这是设计的.您可以使用指向C中的指针而不是引用.引用仅在C++语言中可用.


Boj*_*nik 20

引用是C++的一个特性,而C只支持指针.要让函数修改给定指针的值,请将指针传递给指针:

void getstr(char ** retstr)
{
    char *tmp = (char *)malloc(25);
    strcpy(tmp, "hello,world");
    *retstr = tmp;
}

int main(void)
{
    char *retstr;

    getstr(&retstr);
    printf("%s\n", retstr);

    // Don't forget to free the malloc'd memory
    free(retstr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 当`malloc`返回`void*`时,我发现将它明确地转换为所需类型而不是依赖隐式转换是一种好习惯.如果不包含`stdlib.h`,则转换不会隐藏这一事实 - 编译器会警告您尚未声明`malloc`. (3认同)
  • 不要强制转换`malloc()`.如果你已经包含了`stdlib.h`,它绝对没有.如果你还没有,那就隐藏了这个事实. (2认同)

PP.*_*PP. 5

试试这个:


void
getstr(char **retstr)
{
 char *tmp = (char *)malloc(25);
 strcpy(tmp, "hello,world");
 *retstr = tmp;
}

int
main(void)
{
 char *retstr;

 getstr(&retstr);
 printf("%s\n", retstr);

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,有些人很难看到概念验证测试程序和生产代码之间的区别!很明显,这是一个粗略的准备测试例程,因为没有相应的"免费"但我想有些人会错过这个明显的! (3认同)