从根本上说,是的,它是安全的,因为它是静态的,价值将永久存在。
从另一个角度来看,它并不安全,因为你返回了指向变量数据的常量指针,而不是指向常量数据的可变指针。如果调用函数不被允许修改数据,则更好:
const char *GetString(void)
{
static char sTest[5];
strncpy(sTest, "Test", sizeof(sTest)-1);
sTest[sizeof(sTest)-1] = '\0';
return sTest;
}
在这个简单的例子中,不需要过多担心缓冲区溢出,尽管我的代码版本会考虑并确保空终止符。另一种选择是使用
TR24731函数
strcpy_s
。
const char *GetString(void)
{
static char sTest[5];
strcpy_s(sTest, sizeof(sTest), "Test");
return sTest;
}
更重要的是,这两个变量都返回一个指向常量数据的(可变)指针,因此用户不应该修改字符串并(可能)超出数组的范围。(正如@strager在评论中指出的那样,返回一个
const char *
并不能保证用户不会尝试修改返回的数据。但是,他们必须将返回的指针强制转换为非const并修改数据;这会引发未定义的行为,在那一点上任何事情都有可能发生。)
字面值返回的一个优点是,不写承诺通常可以由编译器和操作系统强制执行。该字符串将被放置在程序的文本(代码)段中,如果用户尝试修改由返回值指向的数据,则操作系统将生成故障(在Unix上进行分段违规)。
[至少另一个答案指出代码不可重入;这是正确的。返回文字的版本是可重入的。如果可重入性很重要,则需要修复接口,以便调用者提供存储数据的空间。]