我正在尝试运行函数,该函数将通过向它们传递指针来返回两个字符串:
#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()会为我的新字符串分配内存,并返回填充字符串的指针。但实际行为是不同的。所以我在寻求帮助。
答案 0 :(得分:6)
您需要使用您的函数来修改指针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;
}
另请注意,您需要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);
第一行未向s1
和s2
分配任何特定值。但是你将它们传递给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;
}