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

StackOverflow https://stackoverflow.com/questions/1421672

  •  07-07-2019
  •  | 
  •  

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

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

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

void main(void)
{
    char x[] = my_function();
}
有帮助吗?

解决方案

如果你有一个返回“字符串文字”的函数,那么它必须返回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";
    }
}

其他提示

你被告知的是是真的。

返回 const char * 可以改善函数的语义(即不要搞砸我给你的东西),但返回 char * 是完美的细

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

最后你 必须 记得 free delete [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;
}

通常,这不是问题,但有些事情需要考虑。这通常是const-correctness的问题,这意味着要记录你可以改变的东西和你不能改变的东西。

如果你要返回一个双引号字符串,它是 const char * ,并且像其他任何东西一样处理它是一个麻烦的邀请。更改此类字符串是未定义的行为,但通常会导致程序崩溃或更改该字符串的任何位置。

如果你在堆栈上返回一个字符数组(即一个被调用函数的局部变量),它就会消失,并且指针将指向任何特定的东西,可能在某个时候结果不好。

如果被调用函数返回已经 const char * 的内容,则将其更改为 char * 需要强制转换。此外,如果你真的要改变它,你需要确保它是可以改变的。将它保存为 const char * 通常要好得多。

返回使用 malloc() new 分配的内存没有立即出现问题,但确实存在所有权问题: free()应该是什么函数 / 删除它,何时以及如何处理可能的副本?这就是C ++的智能指针闪耀的地方。

如果在堆栈上分配了char *,则返回一个悬空指针。否则,只要它匹配函数的原型并且声明与返回值匹配,你应该没问题。

简单地更改返回代码不会导致崩溃。但是,如果返回的字符串是静态的(例如 return" AString" ),则应返回 const char * 以确保编译器检测到任何尝试修改的字符串内存,可能导致崩溃。您当然可以使用强制类型转换器来绕过编译器检查,但在这种情况下,您必须工作才能使崩溃发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top