Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回指向文字(或常量)字符数组(字符串)的指针?_C - Fatal编程技术网

C 返回指向文字(或常量)字符数组(字符串)的指针?

C 返回指向文字(或常量)字符数组(字符串)的指针?,c,C,我知道这是错误的: char* getSomething() { char szLocal[5]; /* put something in the char array somehow */ return szLocal; } …因为szLocal可以在函数返回后的某个时间销毁 但是这样行吗 char* getSomethingElse() { return "something else"; } 那其实没关系。字符串文本通常分

我知道这是错误的:

char* getSomething() {  
    char szLocal[5];  
    /* put something in the char array somehow */  
    return szLocal;  
}  
…因为szLocal可以在函数返回后的某个时间销毁

但是这样行吗

char* getSomethingElse() {  
    return "something else";  
}  

那其实没关系。字符串文本通常分配在一个不可变的内存区域中,该内存区域在程序运行期间保持可用


另请参见的答案。

在分配方面没有问题:字符串文本隐式地是静态的。返回指向文本的非
const
指针是不正确的

如果要返回可修改的(非
常量
)字符串,请将其声明为
静态字符[]
。或者最好返回一份副本:

return strdup("something else");

不要忘了在事后释放
strdup
是非ISO的,但几乎在任何地方都可用(我相信MSVC除外)。

字符串文本的类型是
const char*
(请参见下面的注释)
static char[]
,但不可变。字符串文字表示指向静态分配内存的指针。因此:

  • 返回这样的指针是非常好的

  • 您的函数返回类型必须与
    const char*
    兼容,即返回类型
    char*
    至少会给您一个警告,以后可能会给您带来麻烦

  • 如果您的函数可能同时返回一个literal或
    malloc
    ed字符串,那么您必须非常小心内存管理
    free
    ing字符串文字可能会出错


  • 请参阅。在第一个示例中,szLocal不是在“某个时间之后”销毁的,而是在函数返回的那一刻销毁的,因此返回的指针已经无效。的确,它指向的数据在“一段时间”内保持不变,但函数的堆栈帧已经被释放,内存可以供任何需要创建一些局部变量或调用另一个函数的人使用。我同意romkyns的观点。但是,我们不知道你在用什么系统?可能有一些人不是那样工作的。为了你自己内心的平静,你可以试着有目的地在我们暗示这根弦不存在的记忆上跺脚。i、 e.堆栈。通过声明和分配更多的局部变量,或者使用一些参数调用一些其他函数来获取堆栈上的内容。理想情况下,使用几个参数调用另一个函数,这些参数本身声明并分配一些局部变量。10分钟内回答10个有用的问题。谢谢大家。(我在x64 windows上使用vs2010顺便说一句)字符串文字在应用程序的整个过程中都是有效的。它可能不在只读/不可变内存中,但它们保证在应用程序的生命周期内存在,因此返回指向一个的指针是可以的。实际上,类型是
    static const char[]
    ,即更接近
    const char*const
    。您不能递增或递减文字。@larsman:不,不幸的是,由于历史原因,它的类型不是
    const
    限定的。但是你没有权利改变它:((所以声明返回值
    const
    当然是个好主意,但是语言没有强制执行这一点。@larsman,@Jens:谢谢,我应该在提交之前检查一下。strdup在msvc上不可用?你确定吗?@Arabcoder:不,我不确定,如果我错了,请纠正我。我不做msvc。关于co的观点很好nst.一个(好的)编译器难道不明白这一点吗?试图将常量字符转换为非常量字符?@romkyns:GCC4.5甚至没有抱怨
    -Wall
    :正如Jens Gustedt在nominolo的回答下面指出的,文本不是
    常量
    (G++抱怨,但仍然编译模块,然后我们就离开了C世界。)我明白了。我想如果我是学究,那么返回一个文本作为非常量并不是一个彻底的错误。不过,非常喜欢让你通过使文本为非常量来射击自己的脚。