对于下面给出的C语句,我想知道memmory分配将在何处发生。
char* ptr="Hello";//ptr is a automatic variable
然后指针变量ptr将在堆栈上分配,但是这个字符串“Hello”将在何处被分配。 它是在堆栈上还是在堆上? 那么初始化语句的内存分配怎么样呢 char ptr [] =“你好”;
答案 0 :(得分:12)
标准没有说(它不知道“堆栈”,“堆”等)。但实际上答案是:两者都没有。字符串文字将存储在数据部分中,通常位于只读页面中。
作为旁注,正如Als在评论中提到的那样,尝试修改字符串文字是未定义的行为。
答案 1 :(得分:3)
对于您的示例中的静态字符串,字符串并未真正分配。它的空间是在可执行文件本身中创建的,上面的赋值只是将“ptr”设置为该空间的地址。
我不确定这是否依赖于实现,但字符串通常位于受保护的内存中,因此您无法更改它...仅指向它。
在UNIX中,您可以通过对可执行文件使用“strings”命令来查看可执行文件中的静态字符串。