可能重复:
C 字符串文字:它们去哪儿了?
据我所知,
一般来说,指针必须由malloc()分配,然后分配到堆,然后由free()取消分配;
和
非指针(int,char,float,etc..) 会自动分配到栈中,只要函数返回就不会分配
但是,从以下代码:
#include <stdio.h>
int main()
{
char *a;
a = "tesaja";
return 0;
}
将a
分配到哪里?堆栈还是堆?
可能重复:
C 字符串文字:它们去哪儿了?
据我所知,
一般来说,指针必须由malloc()分配,然后分配到堆,然后由free()取消分配;
和
非指针(int,char,float,etc..) 会自动分配到栈中,只要函数返回就不会分配
但是,从以下代码:
#include <stdio.h>
int main()
{
char *a;
a = "tesaja";
return 0;
}
将a
分配到哪里?堆栈还是堆?
字符串文字将在数据段中分配。指向它的指针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;
}
因此,您的问题的确切答案是:两者都不是。Stack、data、bss和heap都是不同的内存区域。const 静态初始化变量将在data中。
a
它本身(指针)被定义为使用auto
存储类的局部变量(隐式),因此它被分配在堆栈上(或实现用于类似堆栈分配的任何内存 - 某些机器,例如 IBM 大型机和第一个 Crays ,没有正常意义上的“堆栈”)。
字符串文字“tesaja”是静态分配的。确切的位置取决于实现——有些将它与其他数据放在一起,有些将它放在只读数据段中。少数人将所有数据视为读/写,将所有代码视为只读。由于他们希望字符串文字是只读的,因此他们将其放在代码段中。