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

cap*_*ede 13 c heap stack pointers char

可能重复:
C字符串文字:它们去哪里了?

我所知道的,

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

非指针(int,char,float等)将自动分配给堆栈,并且只要函数返回就不会分配

但是,从以下代码:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

uli*_*tko 16

字符串文字将在数据段中分配.指向它的指针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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 也许.如果您平台上的二进制文件有一个. (2认同)
  • @capede和*非指针(int,char,float等)将自动分配给堆栈*是错误的.指针是变量,容器,其大小取决于内存地址的大小.它的分配(指针,而不是它指向的地址)遵循与其他变量相同的规则,具体取决于它们的声明位置. (2认同)

Jer*_*fin 9

a本身(指针)被定义为一个局部变量(隐式地)使用auto存储类,因此它在栈上分配(或任何存储器中的实现使用堆栈状分配-一些机器上,比如IBM大型机以及第一Crays ,在正常意义上没有"堆叠").

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