从函数返回char [] / string

时间:2013-01-19 17:14:35

标签: c arrays string char return

我在C中编码相当新,目前我正在尝试创建一个返回c string / char数组并分配给变量的函数。

到目前为止,我已经观察到返回char *是最常见的解决方案。所以我试过了:

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char str[3];
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    char* cp = str;
    return cp;
}

我的问题是我如何使用这个返回的char*并将它指向的char数组赋值给char []变量?

我试过(都导致了noob-drowning错误):

  1. char* charP = createStr();
  2. char myStr[3] = &createStr();
  3. char* charP = *createStr();

5 个答案:

答案 0 :(得分:33)

请注意,您没有动态分配变量,这意味着函数末尾的str内的数据将在函数结束时丢失。

你应该:

char * createStr() {

    char char1= 'm';
    char char2= 'y';

    char *str = (char *) malloc(sizeof(char) * 3);
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';

    return str;

}

然后,当您调用该函数时,将接收数据的变量的类型必须与函数返回的类型匹配。所以,你应该:

char *returned_str = createStr();

答案 1 :(得分:5)

如果您想从某个功能返回char*,请确保malloc()。堆栈初始化的字符数组在返回时没有意义,因为从该函数返回后访问它们是未定义的行为。

将其更改为

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char *str = malloc(3 * sizeof(char));
    if(str == NULL) return NULL;
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    return str;
}

答案 2 :(得分:5)

char* charP = createStr();

如果您的功能正确,那将是正确的。不幸的是,你返回一个指向函数中局部变量的指针,这意味着一旦函数返回它就是指向未定义数据的指针。您需要为函数中的字符串使用malloc之类的堆分配,以便返回的指针具有任何含义。然后你需要记住以后再释放它。

答案 3 :(得分:1)

包含“string.h”使事情变得更容易。解决问题的更简单方法是:

#include <string.h>
    char* createStr(){
    static char str[20] = "my";
    return str;
}
int main(){
    char a[20];
    strcpy(a,createStr()); //this will copy the returned value of createStr() into a[]
    printf("%s",a);
    return 0;
}

答案 4 :(得分:0)

您可以在方法中使用静态数组,以避免函数结束时丢失数组:

char * createStr() {

char char1= 'm';
char char2= 'y';

static char str[3];  
str[0] = char1;
str[1] = char2;
str[2] = '\0';

return str;

}