一个const char指针在哪里分配内存?

7
在这段代码中: const char * str = "hello world"; 如果我理解正确,指针是4或8字节,我猜它将被分配在堆栈上。 但是,“hello world”的内存分配和存储在哪里呢? 或者说str确切地指向什么?
3个回答

16

它没有被分配。通常存储在程序的代码段或堆栈上,具体取决于编译器。无论哪种方式,它指向一个以空字符结尾的字符数组。


6
可以在数据段或“只读数据”段中,或编译器/链接器决定的其他适当位置。 - Mats Petersson
1
根据您对内存分配的定义,它实际上是已经分配的。您似乎忽略了动态(通过声明为“auto”的变量或使用“malloc”获得空间)和静态分配之间的区别。 - fuz
@FUZxxl 是的,那是个好观点。但通常在C语言中,当我们在字符串的上下文中使用术语“分配”时,我们指的是动态分配。我当时就是这么想的。感谢您的评论。+1 - paddy
这就是为什么我说“根据你的定义而定”。感谢您的澄清。 - fuz

6

实质上,这将被编译为你已经编写的代码:

const static char helloworld[12] 
             = {'h', 'e', 'l', 'l', 'o',' ','w', 'o', 'r', 'l', 'd', '\0'};

const char * str = helloworld;

数组通常会被放置在内存的某个只读区域,可能靠近可执行代码。

根据定义位置的不同,str 可能在堆栈或全局内存空间中。


6

C语言没有堆栈。C语言认为"hello world"是一个字符串字面量,并且字符串字面量具有静态存储期


AKA实现定义? - jn1kk
2
@jsn - 它甚至不需要像“实现定义”那样强制要求。它可以将它们放在任何地方,甚至不必告诉您。 - Carl Norum
3
嗯... C语言同时拥有栈和堆(大部分实现都是如此)。 - James Curran
8
最近,回答有关堆栈和堆的问题时,非常流行的一种说法是C(或C ++)没有这些东西。当然,在标准中,自动变量和从 free store 分配的内存之类的数据结构并没有被强制要求。假设如果提问者询问在“典型”实现中字符串文字存储在哪里,或类似的问题,那么就会找到一种不同的方式来忽略原本想要表达的问题。 - Steve Jessop
3
这是因为C#是一个单一供应商的产品,微软可以基本上说“我们的实现定义了这种语言”(就像Perl和PHP一样)。相比之下,C标准试图捕捉跨越几十年时间和数百个实现的编译器的高级结构,并由一个相对较大的团队仔细研究制定。 - Kerrek SB
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接