C++ 无法正确传递字符数组
一个函数试图将字符数组传递给另一个函数,但没有成功:C++ 无法正确传递字符数组,c++,c,xcode,macos,char,C++,C,Xcode,Macos,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
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);
}
请告诉我,如何解决此问题?您正在返回指向局部变量char buf[32]的指针代码>。此数组在堆栈上分配,仅在函数内有效,在函数外无效。 当您访问此数组时,会出现未定义的行为
要返回这样的数组,您应该在堆上分配它,例如使用
malloc()
返回一个指向局部变量char buf[32]的指针代码>。此数组在堆栈上分配,仅在函数内有效,在函数外无效。
当您访问此数组时,会出现未定义的行为
要返回这样的数组,您应该在堆上分配它,例如使用
malloc()
您不能返回指向局部变量的指针;一旦函数返回,局部变量以及函数堆栈帧的其余部分将被销毁
相反,您可以返回数组的副本;您可以使用strdup()
制作一个
另一方面,您正在设置数组的第一个字符,并在末尾添加一个\0,但中间的30个字符只包含垃圾。通常,字符串末尾的\0紧跟在有效字符之后,而不是一直在数组末尾。不能返回指向局部变量的指针;一旦函数返回,局部变量以及函数堆栈帧的其余部分将被销毁 相反,您可以返回数组的副本;您可以使用
strdup()
制作一个
另一方面,您正在设置数组的第一个字符,并在末尾添加一个\0,但中间的30个字符只包含垃圾。通常,字符串末尾的\0紧跟在有效字符之后,而不是一直在数组末尾。您可以通过不返回局部变量(分配字符串或返回指向静态分配的字符串的指针)来解决此问题:
您可以通过不返回局部变量(分配字符串或返回指向静态分配变量的指针)来解决此问题:
您正在返回一个局部变量为什么希望它有1?您认为这段代码有什么问题还不清楚。您能再详细说明一下吗?我想将buf数组(由ret()函数返回)复制到temp数组中。您返回的本地变量可能是重复的。为什么希望它有1?您认为这段代码有什么问题还不清楚。您能详细说明一下吗?我想将buf数组(由ret()函数返回)复制到temp数组中。正确行的可能副本是:
char*buf=(char*)malloc(32*sizeof(char))但是你的回答真的帮助了我!非常感谢。不,在C语言中,您通常不会强制转换malloc()的返回值,请参见我前面提到的一行,它为meth编译的正确行是:char*buf=(char*)malloc(32*sizeof(char))但是你的回答真的帮助了我!非常感谢。不,在C语言中,通常不会强制转换malloc()的返回值,请参阅前面提到的一行代码,它为我编译
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);
}