【发布时间】:2017-04-02 08:05:26
【问题描述】:
我注意到字符串文字在内存中的地址与其他常量和变量(Linux 操作系统)有很大不同:它们有许多前导零(未打印)。
例子:
const char *h = "Hi";
int i = 1;
printf ("%p\n", (void *) h);
printf ("%p\n", (void *) &i);
输出:
0x400634
0x7fffc1ef1a4c
我知道它们存储在可执行文件的.rodata 部分。操作系统之后是否有一种特殊的处理方式,所以文字最终会出现在一个特殊的内存区域(带有前导零)?该内存位置有什么优点吗?或者它有什么特别之处?
【问题讨论】:
-
这完全取决于操作系统加载代码和分配堆栈的位置。
-
显然是实现指定的,但 RO 数据(您的文字)通常被加载到标记为保护模式写时异常触发的单独页面中。含义:写入它会引发结构化异常。
-
您的问题是关于 Linux、一般托管系统(带有操作系统)还是包括独立系统(通常嵌入没有操作系统)?如果仅限 Linux,则应添加
[linux]标签。如果还有其他问题,请澄清。 -
您的问题又回到了前面。您会发现 all 地址有“许多前导零” except 局部变量的地址,这些地址位于堆栈上,在您的情况下从地址顶部分配向下空间。
-
要让你的字符串更像你的
int i = 1,你可能想试试char h[] = "Hi"
标签: c linux memory memory-address string-literals