将在何处进行C中字符串的内存分配

时间:2011-11-03 19:01:28

标签: c memory-management heap-memory stack-memory

对于下面给出的C语句,我想知道memmory分配将在何处发生。

char* ptr="Hello";//ptr is a automatic variable

然后指针变量ptr将在堆栈上分配,但是这个字符串“Hello”将在何处被分配。 它是在堆栈上还是在堆上? 那么初始化语句的内存分配怎么样呢     char ptr [] =“你好”;

2 个答案:

答案 0 :(得分:12)

标准没有说(它不知道“堆栈”,“堆”等)。但实际上答案是:两者都没有。字符串文字将存储在数据部分中,通常位于只读页面中。

作为旁注,正如Als在评论中提到的那样,尝试修改字符串文字是未定义的行为。

答案 1 :(得分:3)

对于您的示例中的静态字符串,字符串并未真正分配。它的空间是在可执行文件本身中创建的,上面的赋值只是将“ptr”设置为该空间的地址。

我不确定这是否依赖于实现,但字符串通常位于受保护的内存中,因此您无法更改它...仅指向它。

在UNIX中,您可以通过对可执行文件使用“strings”命令来查看可执行文件中的静态字符串。