据我所知,
通常,指针必须是 由malloc()分配,并将被分配 堆,然后由free(); 取消分配
和
非指针(int,char,float等)将是 自动分配到堆栈,和 只要函数转到,就不会分配 返回
但是,从以下代码:
#include <stdio.h>
int main()
{
char *a;
a = "tesaja";
return 0;
}
将a
分配到哪里?堆栈还是堆?
答案 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”是静态分配的。具体取决于实现方式 - 有些将其与其他数据放在一起,有些则将其放在只读数据段中。一些人将所有数据视为读/写,所有代码都是只读的。由于他们希望字符串文字是只读的,因此将它放在代码段中。