可以/为什么在返回类型中使用char*而不是const char*会导致崩溃?

And*_*ndy 6 c const char

我在某处读到如果你想要一个C/C++函数来返回一个字符数组(而不是std :: string),你必须返回const char*而不是char*.执行后者可能会导致程序崩溃.

有人能够解释这是否属实?如果是真的,为什么从一个如此危险的函数返回一个char*?谢谢.

const char * my_function()
{
    ....
}

void main(void)
{
    char x[] = my_function();
}
Run Code Online (Sandbox Code Playgroud)

Zan*_*ynx 14

如果你有一个返回"字符串文字"的函数,那么它必须返回const char*.这些不需要由malloc在堆上分配,因为它们被编译为可执行文件本身的只读部分.

例:

const char* errstr(int err)
{
    switch(err) {
        case 1: return "error 1";
        case 2: return "error 2";
        case 3: return "error 3";
        case 255: return "error 255 to make this sparse so people don't ask me why I didn't use an array of const char*";
        default: return "unknown error";
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*ton 11

你被告知的事实并非如此.

返回a const char *可以改进函数的语义(即不要搞砸我给你的东西),但返回a char *是完全正常的.

但是,在任何一种情况下,您必须确保返回一个char *const char *在堆上分配的my_function(即使用malloc或分配new),否则每当my_function返回时,[const] char *将释放该内存,并且您将访问无效指针.

最后,你必须记住,freedelete[const] char *一个已经退还给你,一旦你用它做,否则你会泄漏内存.C/C++不是这么好的语言吗?

所以,在C中,你会有

const char *my_function() {
    const char *my_str = (const char *)malloc(MY_STR_LEN + 1);  // +1 for null terminator.
    /* ... */
    return my_str;
}

int main() {
    const char *my_str = my_function();
    /* ... */
    free(my_str);
    /* ... */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)