【问题标题】: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 将分配到哪里?堆栈还是堆?

【问题讨论】:

  • 在您的示例中,“tesaja”被称为字符串文字。文本是不变的,也就是只读的,可以放在任何地方。它可以放在可执行区域并复制到可写内存中。实际位置取决于编译器设置和平台。

标签: c pointers char heap-memory stack-memory


【解决方案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”是静态分配的。确切的位置取决于实现——有些将它与其他数据放在一起,有些将它放在只读数据段中。少数人将所有数据视为读/写,将所有代码视为只读。由于他们希望字符串文字是只读的,因此他们将其放在代码段中。

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2015-06-02
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多