内存中的字符串文字是什么?堆栈/堆?

时间:2011-02-11 15:28:25

标签: c pointers stack char heap

  

可能重复:
  C String literals: Where do they go?

据我所知,

  通常,指针必须是   由malloc()分配,并将被分配   堆,然后由free();

取消分配

  

非指针(int,char,float等)将是   自动分配到堆栈,和   只要函数转到,就不会分配   返回

但是,从以下代码:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

a分配到哪里?堆栈还是堆?

2 个答案:

答案 0 :(得分:14)

字符串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;
}

因此,您问题的确切答案是:既不堆栈数据 bss 都是内存的不同区域。 Const静态初始化变量将位于 data

答案 1 :(得分:9)

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

字符串文字“tesaja”是静态分配的。具体取决于实现方式 - 有些将其与其他数据放在一起,有些则将其放在只读数据段中。一些人将所有数据视为读/写,所有代码都是只读的。由于他们希望字符串文字是只读的,因此将它放在代码段中。