C使用函数参数返回值

Jos*_*siP 0 c

我正在尝试运行函数,它将通过传递指针返回两个字符串:

#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()会为我的新字符串分配内存,并返回填充字符串的指针.但实际行为是不同的.所以我在寻求帮助.

Oli*_*rth 6

你需要你的函数修改指针s1s2,所以你需要通过自己的地址,所以该函数可以修改原件,不是复印件.

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在某些时候使用这些字符串,否则会出现内存泄漏.


Ker*_* SB 5

你的指针很困惑.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().