我读的地方,如果你想有一个C / C ++函数返回一个字符数组(而不是的std :: string),你必须返回为const char *而不是char *。 否则后者可能会导致程序崩溃。
会有人能够解释这是否是真还是假? 如果这是真的,为什么从函数返回一个char *如此危险? 谢谢。
const char * my_function()
{
....
}
void main(void)
{
char x[] = my_function();
}
我读的地方,如果你想有一个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 char *
和治疗它像别的是找麻烦的邀请。 改变这样的字符串是未定义的行为,但通常会导致程序崩溃或更改该字符串无论它的简称。
如果堆栈(即调用函数的局部变量)上返回的字符数组,它会消失,指针会指向什么特别的,可能与在某些时候坏的结果。
如果被调用函数返回东西是已经const char *
,然后将其更改为char *
需要一个演员。 此外,如果你真的要改变它,你必须确保它的多变。 它通常是更好地保持它作为const char *
。
有与返回的与分配的内存没有直接的问题malloc()
或new
,但你必须所有权的问题:应该什么功能free()
/ delete
它时,您怎么办可能副本? 这是C ++的智能指针熠熠生辉。
如果字符*是在栈上分配的,你返回一个悬摆指针。 否则,只要它的函数原型匹配和声明的返回值匹配,你应该罚款。
简单地改变返回代码不会导致崩溃。 不过,如果你返回字符串是静态的(例如return "AString"
),你应该返回const char *
,以确保编译器检测到内存,这将有可能导致崩溃的任何企图修改。 你当然可以使用强制类型转换和这样绕过编译器检查,但在这种情况下,你不得不努力使碰撞发生。