字符串字面量存储在内存的哪里?堆栈/堆?

15

可能重复:
C字符串字面量:它们去哪儿了?

据我所知,

通常情况下,指针必须通过malloc()进行分配,并将其分配到堆中,然后通过free()取消分配;

非指针(int、char、float等)将自动分配到堆栈中,并在函数返回时取消分配。

但是,从以下代码可以看出:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

a会被分配到堆还是栈中?


3
可能是https://dev59.com/p3E85IYBdhLWcg3w1HKF的重复问题。 - Alexander Gessler
在你的例子中,“tesaja”被称为字符串字面量。该文本是常量,也就是只读的,并且可以放置在任何地方。它可以放置在可执行区域并复制到可写内存中。实际位置取决于编译器设置和平台。 - Thomas Matthews
2个回答

20

字符串字面量将会被分配在数据段中,指向它的指针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都是不同的内存区域。常量静态初始化变量将位于data中。

2
可能。如果您的平台有二进制文件。 - Flexo
2
@capede,“非指针类型(int、char、float等)将自动分配到堆栈”是错误的。指针是一个变量,一个容器,其大小取决于内存地址的大小。它的分配(指针,而不是它所指向的地址)遵循与其他变量相同的规则,取决于它们声明的位置。 - Déjà vu
你知道在哪里可以获取关于“变量空间分配”的文档吗? - capede
可执行的内存区域被称为什么?是“堆栈”吗?还是没有特定的名称,只是“可执行的内存区域”? - capede
1
@capede,你真的需要用汇编语言编写程序。这样你就能很好地理解内存分段了。 - ulidtko
显示剩余4条评论

11

a本身(指针)被定义为一个局部变量(隐式地)使用了auto存储类型,所以它在堆栈上分配内存(或者实现中用于类似堆栈的分配的其他内存,例如IBM大型机和第一批Cray机器没有"stack" 的正常意义)。

字符串字面量"tesaja"是静态分配的。它将被分配到何处取决于实现方式——有些将它与其他数据放在一起,有些将它放在只读数据段中。有些少数把所有数据都视为可读/可写,所有代码都视为只读的。由于他们希望字符串字面量是只读的,因此将其放在代码段中。


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