内存中的字符串文字在哪里?堆栈/堆? [复制]
Posted
技术标签:
【中文标题】内存中的字符串文字在哪里?堆栈/堆? [复制]【英文标题】:Where in memory are string literals ? stack / heap? [duplicate] 【发布时间】:2011-06-25 15:26:45 【问题描述】:可能重复:C String literals: Where do they go?
据我所知
一般来说,指针必须是 由 malloc() 分配,并将被分配 堆,然后由 free() 取消分配;
和
非指针(int,char,float,etc..) 将是 自动分配给堆栈,并且 未分配,只要函数转到 返回
但是,从以下代码:
#include <stdio.h>
int main()
char *a;
a = "tesaja";
return 0;
a
将分配到哪里?堆栈还是堆?
【问题讨论】:
***.com/questions/2589949/…的可能重复 在您的示例中,“tesaja”被称为字符串文字。文本是不变的,也就是只读的,可以放在任何地方。它可以放在可执行区域并复制到可写内存中。实际位置取决于编译器设置和平台。 【参考方案1】:字符串literal 将分配到data segment。指向它的指针a
将在堆栈上分配。
你的代码最终会被编译器转换成这样的:
#include <stdio.h>
const static char literal_constant_34562[7] = 't', 'e', 's', 'a', 'j', 'a', '\0';
int main()
char *a;
a = &literal_constant_34562[0];
return 0;
因此,您的问题的确切答案是:都不是。 Stack、data、bss 和 heap 都是不同的内存区域。 const 静态初始化变量将在 data 中。
【讨论】:
也许吧。如果您平台上的二进制文件有一个。 @capede 和 非指针(int,char,float,etc..) 将自动分配给堆栈 是错误的。指针是一个变量,一个容器,它的大小取决于内存地址的大小。它的分配(指针,而不是它指向的地址)遵循与其他变量相同的规则,具体取决于它们的声明位置。 @ring0 :where they're declared
是什么意思?内部函数和外部函数?
@capede 是的,例如。在函数内部,一个块,作为参数,作为全局变量......,但也作为静态,作为易失......编译器在每种情况下决定它必须如何处理变量空间分配。
@capede,你真的需要用汇编程序编写程序。这样你就会很好地理解内存分割。【参考方案2】:
a
本身(指针)被定义为使用 auto
存储类的局部变量(隐式),因此它被分配在堆栈上(或实现用于类似堆栈分配的任何内存 - 一些机器,比如IBM大型机和第一代Cray,没有正常意义上的“栈”)。
字符串文字“tesaja”是静态分配的。确切的位置取决于实现——有些将它与其他数据放在一起,有些将它放在只读数据段中。少数人将所有数据视为读/写,将所有代码视为只读。由于他们希望字符串文字是只读的,因此他们将其放在代码段中。
【讨论】:
以上是关于内存中的字符串文字在哪里?堆栈/堆? [复制]的主要内容,如果未能解决你的问题,请参考以下文章