C使用函数参数返回值

时间:2011-11-10 00:19:19

标签: 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;
}

其中输出为:

str1 abcd str2 defg


 s1 8, s2 8,

有人能告诉我,我做错了什么?我认为strdup()会为我的新字符串分配内存,并返回填充字符串的指针。但实际行为是不同的。所以我在寻求帮助。

4 个答案:

答案 0 :(得分: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;
}

另请注意,您需要free这些字符串,否则会导致内存泄漏。

答案 1 :(得分:5)

你的指针很困惑。 C字符串的基本类型已经是char*,现在您需要指向的指针,即char**

void fill_me(char ** ps)
{
  const char * t = "hello";
  *ps = strdup(t);
}

/* elsewhere */
char * s;
fill_me(&s);

道德:如果你想要一个函数修改调用者传递的参数,调用者需要在某个时候采用地址(&)。

答案 2 :(得分:0)

您只是更改了函数内部的指针。要在函数外部更改它,您需要将函数传递给两个字符串的地址,如下所示:

#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;
}

答案 3 :(得分:0)

您可以在初始化之前使用变量的值!

   char *s1, *s2;
   gen_str(s1, s2);

第一行未向s1s2分配任何特定值。但是你将它们传递给gen_str。要让另一个函数填入变量的值,将指向该变量的指针传递给函数,而不是它的值。

#include <stdio.h>
#include <string.h>

void gen_str(char **str1, char **str2){
   const char *s1 = "abcd";
   const char *s2 = "defg";
   *str1 = strdup(s1);
   *str2 = strdup(s2);
   printf("\n str1 %s str2 %s\n", *str1, *str2);
}


int main(void){
   char *s1, *s2;
   gen_str(&s1, &s2);
   printf("\n s1 %s s2 %s\n", s1, s2);
   free(s1);
   free(s2);
   return 0;
}