Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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中的函数返回常量char*_C_Api_Gcc_Constants - Fatal编程技术网

从C中的函数返回常量char*

从C中的函数返回常量char*,c,api,gcc,constants,C,Api,Gcc,Constants,在我的库中,我必须向调用者返回一个字符串。我返回的字符串将是一个全局数组,调用者的预期用途只是读取字符串。我不想让他们修改它 这是声明函数的正确方法吗 const char * get_some_details(); 当调用方将返回值分配给char*ptr或分配给const char*ptr,但稍后尝试修改时,这将生成警告(仅限gcc) 我这样问是因为我希望像getenv()这样的函数返回const char*。但它返回char*。返回const char* 许多较旧的API不使用const,

在我的库中,我必须向调用者返回一个字符串。我返回的字符串将是一个全局数组,调用者的预期用途只是读取字符串。我不想让他们修改它

这是声明函数的正确方法吗

const char * get_some_details();
当调用方将返回值分配给char*ptr或分配给const char*ptr,但稍后尝试修改时,这将生成警告(仅限gcc)


我这样问是因为我希望像getenv()这样的函数返回const char*。但它返回char*。返回const char*


许多较旧的API不使用
const
,因为它们早于C90中引入
const
(在此之前没有
const

这是正确的方法


许多标准库函数在逻辑上应该是
const char*
时接受或返回
char*
,因为历史原因:在C89之前,没有
const
;C89之后,如果不破坏应用程序代码,则无法更改其类型签名。一般来说,不要将标准库用作样式指南;它非常古老,包含许多不再被视为良好实践的东西。(cough
gets

幸运的是,C11中删除了
gets
。请注意,这一原理不适用于原始帖子中的getenv示例。getenv接受常量char*并返回char*getenv返回char*,因为返回的缓冲区指针不是常量。它包含调用getenv后的结果字符串,但将来调用getenv、setenv或UnsetEnv时可以更改相同的缓冲区,因此getenv()的以下用法不正确?name=getenv(“name”);id=getenv(“id”);使用name&id。对getenv()的第二次调用可能会覆盖之前指向的任何名称