从函数返回字符串字面量是否安全?三类技术疑问解析
从函数返回字符串字面量是否真的安全?
先看两段对比代码:
第一段代码编译无警告:
char *test() { return "HELLO"; } int main() { char *p = test(); printf("%s\n", p); }
第二段代码会触发编译器警告:
char *test() { char arr[] = "HELLO"; return arr; } int main() { char *p = test(); printf("%s\n", p); }
针对你提出的三个问题,逐一解答:
1. 字符串字面量是否确实存储在名为string literal pool的内存区域?
C语言标准里并没有"string literal pool"这个官方术语,但在大多数编译器的实现中,字符串字面量会被存放在只读数据段(比如Linux下ELF文件的.rodata段)。为了节省内存,很多编译器会把内容相同的字符串字面量合并到同一个内存地址,这个合并机制常被称为"字符串池",但这属于实现细节,不是C标准强制要求的行为。
2. 若上述结论成立,该区域存储的数据是否可视为全局数据?
可以视为具有全局生命周期的数据。这类内存区域在程序启动时就完成分配,直到程序退出才会被释放,生命周期和全局变量完全一致。不过要注意:字符串字面量是只读的,尝试修改它会触发未定义行为(比如程序崩溃),这一点和普通可写全局变量不同。
3. 由于字符串字面量类似全局数据,从函数返回它是否始终安全?
是的,始终安全。因为字符串字面量的生命周期覆盖整个程序运行期,函数返回后,指向它的指针依然指向有效的内存区域,后续使用这个指针不会出现问题。
而第二段代码中char arr[] = "HELLO"是把字符串字面量的内容复制到栈上的数组中,栈内存会在函数返回后被回收复用,此时返回的数组指针就变成了"悬空指针",后续访问会导致未定义行为,这也是编译器发出警告的原因。
内容的提问来源于stack exchange,提问作者alessio solari
相关产品推荐
相关产品推荐

