无法正确传递char数组

could not pass a char array properly

本文关键字:char 数组      更新时间:2023-10-16

一个函数试图将char数组传递给另一个,但没有成功:

char * ret() {
    char buf[32];
    buf[0]='1'; // buf char array contains 1
    buf[31]='';
    printf(buf);
    return buf;
}
int multiline() {
    char temp[32];
    strcpy(temp,ret()); // temp array doesn't contain 1 after this line
    temp[31]=''; 
    printf(temp);
}

请告诉我,如何解决这个问题?

您正在返回一个指向局部变量char buf[32];的指针。此数组是在堆栈上分配的,仅在函数内有效,而在函数外无效。访问此数组时会得到未定义的行为。

要返回这样的数组,您应该在堆上分配它,例如使用malloc()

您可以通过不返回本地变量(分配一个字符串或返回一个指向静态分配的字符串的指针)来解决此问题:

char * ret() {
    char * buf = malloc(32*sizeof(char));
    buf[0]='1'; // buf char array contains 1
    buf[31]='';
    printf(buf);
    return buf;
}
int multiline() {
    char temp[32];
    char * returnedString = ret();
    strcpy(temp,returnedString);
    free(returnedString);
    temp[31]=''; 
    printf(temp);
}

不能返回指向局部变量的指针;一旦函数返回,局部变量以及函数堆栈框架的其余部分就会被销毁。

相反,您可以返回数组的副本;你可以用strdup()做一个。

顺便说一句,您正在设置数组的第一个字符,并在末尾放一个\0,但中间的30个字符只包含垃圾。通常,字符串末尾的\0紧跟在有效字符之后,而不是一直在数组末尾。