从函数返回char []/string

use*_*177 29 c arrays string return char

我在C中编码相当新,目前我正在尝试创建一个返回ac字符串/ 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rub*_*ens 36

请注意,您没有动态分配变量,这几乎意味着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;

}
Run Code Online (Sandbox Code Playgroud)

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

char *returned_str = createStr();
Run Code Online (Sandbox Code Playgroud)

  • `sizeof(char)`保证为1并且没有理由对`malloc`返回进行类型转换 (4认同)

A.R*_*.D. 6

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

char * createStr() 
{
    char char1= 'm';
    char char2= 'y';

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

    return str;
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如 Toby Speight 所提到的,这种方法不是线程安全的,而且调用该函数会导致某些应用程序中不需要的数据覆盖。因此,一旦从函数返回,就必须将数据保存在缓冲区中。(但是因为它不是线程安全的方法,在某些情况下并发调用仍然会产生问题,为了防止这种情况,你必须使用锁。进入函数时捕获它并在复制完成后释放它,我不喜欢使用它方法,因为它凌乱且容易出错。)

  • 可能值得一提的是一些缺点(所有调用共享相同的存储,因此调用将覆盖以前的结果,并且没有什么是线程安全的)。 (2认同)

Ani*_*nge 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是必须释放返回的值以防止内存泄漏.`char*astr = createStr(); doSomething的(而aStr); 自由(而aStr);` (7认同)

Pau*_*aul 5

char* charP = createStr();
Run Code Online (Sandbox Code Playgroud)

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