47

我对 C 语言编码相当陌生,目前我正在尝试创建一个返回 ac 字符串/字符数组并分配给变量的函数。

到目前为止,我观察到返回一个 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[] 变量?

我试过(都导致菜鸟溺水错误):

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

5 回答 5

62

请注意,您不是动态分配变量,这几乎意味着函数中的数据str将在函数结束时丢失。

你应该有:

char * createStr() {

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

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

    return str;

}

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

char *returned_str = createStr();

值得一提的是,必须释放返回值以防止内存泄漏。

char *returned_str = createStr();

//doSomething
...

free(returned_str);
于 2013-01-19T17:18:33.227 回答
9

如果你想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;
}
于 2013-01-19T17:17:12.973 回答
7

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

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

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

    return str;
}

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

于 2018-07-29T13:44:46.270 回答
6
char* charP = createStr();

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

于 2013-01-19T17:18:12.447 回答
3

包含“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;
}
于 2017-03-11T11:16:55.153 回答