我正在尝试运行函数,它将通过传递指针返回两个字符串:
#include <stdio.h>
void gen_str(char *str1, char *str2){
char *s1 = "abcd";
char *s2 = "defg";
str1= strdup(s1);
str2= strdup(s2);
printf("\n\r str1 %s str2 %s\n\r", str1, str2);
}
int main(void){
char *s1, *s2;
gen_str(s1, s2);
printf("\n\r s1 %s s2 %s\n\r", s1, s2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中输出是:
str1 abcd str2 defg
s1 8, s2 8,
Run Code Online (Sandbox Code Playgroud)
有人能告诉我,我做错了什么?我认为strdup()会为我的新字符串分配内存,并返回填充字符串的指针.但实际行为是不同的.所以我在寻求帮助.
你需要你的函数修改指针s1和s2,所以你需要通过自己的地址,所以该函数可以修改原件,不是复印件.
void gen_str(char **str1, char **str2){
char *s1 = "abcd";
char *s2 = "defg";
*str1= strdup(s1);
*str2= strdup(s2);
printf("\n\r str1 %s str2 %s\n\r", *str1, *str2);
}
int main(void){
char *s1, *s2;
gen_str(&s1, &s2);
printf("\n\r s1 %s s2 %s\n\r", s1, s2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您需要free在某些时候使用这些字符串,否则会出现内存泄漏.
你的指针很困惑.C字符串的基本类型已经存在char*,现在你想要一个指向它的指针,即char**:
void fill_me(char ** ps)
{
const char * t = "hello";
*ps = strdup(t);
}
/* elsewhere */
char * s;
fill_me(&s);
Run Code Online (Sandbox Code Playgroud)
道德:如果你想要一个函数来修改调用者传递的参数,调用者需要&在某个时候采用address-of().