内存中的字符串文字在哪里?堆栈/堆? [复制]

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;

因此,您的问题的确切答案是:都不是Stackdatabssheap 都是不同的内存区域。 const 静态初始化变量将在 data 中。

【讨论】:

也许吧。如果您平台上的二进制文件有一个。 @capede 和 非指针(int,char,float,etc..) 将自动分配给堆栈 是错误的。指针是一个变量,一个容器,它的大小取决于内存地址的大小。它的分配(指针,而不是它指向的地址)遵循与其他变量相同的规则,具体取决于它们的声明位置。 @ring0 :where they're declared 是什么意思?内部函数和外部函数? @capede 是的,例如。在函数内部,一个块,作为参数,作为全局变量......,但也作为静态,作为易失......编译器在每种情况下决定它必须如何处理变量空间分配。 @capede,你真的需要用汇编程序编写程序。这样你就会很好地理解内存分割。【参考方案2】:

a 本身(指针)被定义为使用 auto 存储类的局部变量(隐式),因此它被分配在堆栈上(或实现用于类似堆栈分配的任何内存 - 一些机器,比如IBM大型机和第一代Cray,没有正常意义上的“栈”)。

字符串文字“tesaja”是静态分配的。确切的位置取决于实现——有些将它与其他数据放在一起,有些将它放在只读数据段中。少数人将所有数据视为读/写,将所有代码视为只读。由于他们希望字符串文字是只读的,因此他们将其放在代码段中。

【讨论】:

以上是关于内存中的字符串文字在哪里?堆栈/堆? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在堆内存中存放十个字符串并输出 堆栈溢出时退出程序

用完堆内存尝试在 Java 中将单个字符推送到堆栈

js堆栈内存的释放

堆栈内存和堆内存之间的区别[重复]

JS中的堆栈内存

std::string 在内存中分配的位置在哪里?