我有类似以下的功能:
const char* get_message() {
return "This is a constant message, will NOT change forever!";
};
const char* get_message2() {
return "message2";
};
我计划在我的应用程序的任何地方使用它们,即使在不同的线程中。
我想知道这些字符串的生命周期,即在 func get_message* 之外使用这些
const char*
字符串是否安全。
我猜想硬编码的
const char*
字符串将被编译到应用程序的代码段而不是数据段中,所以也许像上面那样使用它们是安全的?
对不起我的英语不好!
是的,这样做是安全的。你的假设是正确的。
让我们看看代码中 gdb
发生了什么我们在函数中放置断点,返回指向常量字符串的指针:
我们在进程地址映射中看到地址 0x555555556004 已在部分
0x555555556000 0x555555557000 0x1000 0x2000 r--p /home/drazen/proba/main
因此该部分不可执行且不可写,仅可读。
当我们检查 wid readelf 时,它显示它位于 ELF 文件的 .rodata 部分:
drazen@HP-ProBook-640G1:~/proba$ readelf -x .rodata main
Hex dump of section '.rodata':
0x00002000 01000200 6d657373 61676532 00 ....message2.
所以答案是它不会在 ELF 文件的代码段 .text 中,而是在 rodata
中希望有帮助!