内存中的字符串文字是什么? 堆栈/堆?
可能重复:
C字符串文字:它们去哪儿了?
我所知道的,
通常,指针必须由malloc()分配,并将分配给堆,然后由free()取消分配;
和
非指针(int,char,float等)将自动分配给堆栈,并且只要函数返回就不会分配
但是,从以下代码:
#include int main() { char *a; a = "tesaja"; return 0; }
分配到哪里? 堆栈还是堆?
字符串文字将在数据段中分配。 指向它的指针a
将在堆栈上分配。
您的代码最终会被编译器转换为以下内容:
#include 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静态初始化变量将在数据中 。
a
本身(指针)使用auto
存储类定义为本地变量(隐式),因此它被分配在堆栈上(或实现用于堆栈式分配的任何内存 – 某些机器,例如IBM大型机和第一个Crays,在正常意义上没有“堆叠”)。
字符串文字“tesaja”是静态分配的。 具体取决于实现方式 – 有些将其与其他数据放在一起,有些则将其放在只读数据段中。 一些人将所有数据视为读/写,所有代码都是只读的。 由于他们希望字符串文字是只读的,因此将它放在代码段中。