#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;
}
gcc
无法编译此文件,但在添加#include <cstring>
后,我可以使用g ++编译此源文件。
问题是:C编程语言是否支持通过引用传递指针参数?如果没有,为什么?
感谢。
答案 0 :(得分:29)
不,C不支持引用。这是设计的。您可以使用指向C中的指针而不是引用。引用仅在C ++语言中可用。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
答案 3 :(得分:2)
这应该是一个评论,但对于评论框来说它太长了,所以我正在做CW。
您提供的代码可以更好地写为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void
getstr(char **retstr)
{
*retstr = malloc(25);
if ( *retstr ) {
strcpy(*retstr, "hello,world");
}
return;
}
int
main(void)
{
char *retstr;
getstr(&retstr);
if ( retstr ) {
printf("%s\n", retstr);
}
return 0;
}
答案 4 :(得分:1)
libgmp中有一个有趣的技巧,可以模拟引用:
typedef mpz_t __mpz_struct[1];
然后你可以像这样写:
mpz_t n;
mpz_init(n);
...
mpz_clear(n);
我不建议使用这种方法,因为它可能对其他人来说是不可理解的,它仍然不能防止成为NULL:mpz_init((void *)NULL)
,并且它与指针到指针的对应部分一样冗长
答案 5 :(得分:0)
C lang没有引用变量,但它是C ++的一部分。
引入引用的原因是避免悬空指针 并预先检查指针的无效性。
您可以将引用视为常量指针,即const指针只能指向已初始化为指向的数据。