一个函数尝试将char数组传递给另一个,但没有成功:
char * ret() {
char buf[32];
buf[0]='1'; // buf char array contains 1
buf[31]='\0';
printf(buf);
return buf;
}
int multiline() {
char temp[32];
strcpy(temp,ret()); // temp array doesn't contain 1 after this line
temp[31]='\0';
printf(temp);
}
请告诉我,如何解决这个问题?
答案 0 :(得分:2)
您正在返回指向局部变量char buf[32];
的指针。此数组在堆栈上分配,仅在函数内有效,但不在函数外部。
访问此数组时会出现未定义的行为。
要返回这样的数组,你应该在堆上分配它,例如。与malloc()
答案 1 :(得分:1)
您不能返回指向局部变量的指针;一旦函数返回,局部变量以及函数堆栈帧的其余部分就会被销毁。
相反,您可以返回数组的副本;你可以使用strdup()
创建一个。
顺便说一句,你要设置数组的第一个字符,并在结尾放一个\ 0,但中间的30个字符只是保存垃圾。通常,字符串末尾的\ 0紧跟在有效字符之后,而不是在数组末尾。
答案 2 :(得分:1)
您可以通过不返回局部变量(分配字符串或返回指向静态分配的指针)来解决问题:
char * ret() {
char * buf = malloc(32*sizeof(char));
buf[0]='1'; // buf char array contains 1
buf[31]='\0';
printf(buf);
return buf;
}
int multiline() {
char temp[32];
char * returnedString = ret();
strcpy(temp,returnedString);
free(returnedString);
temp[31]='\0';
printf(temp);
}