无法正确传递char数组

时间:2012-02-04 18:42:28

标签: c++ c xcode macos char

一个函数尝试将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);
}

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

3 个答案:

答案 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);
}
相关问题