在c中,为不可变字符串分配的内存在哪里?
我试图理解c程序中内存分配的位置在c中,为不可变字符串分配的内存在哪里?,c,pointers,memory-management,dynamic-memory-allocation,string-literals,C,Pointers,Memory Management,Dynamic Memory Allocation,String Literals,我试图理解c程序中内存分配的位置 void func1(char e, int f, int g) { int b = 4; char * s = "hello world"; char * temp = (char *) malloc(15); } 据我所知,在堆栈b、s和temp上分配了三个自动变量。其中b(4)的内容存储在堆栈上,指针s和temp存储在堆栈上,temp的数据存储在堆中,但s的数据存储在哪里?因为当我们离开func1调用时,b、s和temp将消失
void func1(char e, int f, int g)
{
int b = 4;
char * s = "hello world";
char * temp = (char *) malloc(15);
}
据我所知,在堆栈b、s和temp上分配了三个自动变量。其中b(4)的内容存储在堆栈上,指针s和temp存储在堆栈上,temp的数据存储在堆中,但s的数据存储在哪里?因为当我们离开func1调用时,b、s和temp将消失,但内容的内存已被永久分配。我的另一个问题是堆栈指针总是向下移动4,就像在打开函数参数时一样,即使是一个字符是一个字节?
即使e只有一个字节,堆栈看起来会像这样吗
30:// other stuff
26: g
22: f
18: e
这不是c程序的布局吗?它取决于您的平台,并且是由实现定义的。一般情况下,如果系统上有可用的话,它会转到只读存储器。阅读更多 正如您所指出的,当函数终止时,自动变量将消失,导致内存泄漏,但仅适用于动态分配内存的情况 这意味着您必须让
func1()
与其调用者进行temp
通信(例如main()
),以便以后可以free()。或者,如果在函数完成其工作后不需要它,则在退出函数之前将其释放
顺便说一下,正如iharob所说:
至于你的另一个问题,这应该是一个新问题,请阅读,它们可能会有所帮助。在标准C术语中,有四种可能的存储持续时间:
- 自动(
b
)
- 静态(
“Hello world”
)
- 动态(malloc(15)
分配的空间)
.rodata
部分,但它在物理上会在哪里。。参见上文。请阅读不应强制转换的返回值的原因。我认为你对堆栈的看法是正确的,但也要注意,没有char
s,只有指针,指针是4或8。字符串文字是代码中“hello world”字符串的正确术语,应位于中。它将是只读的。请尝试将其编译为程序集,以查看会发生什么。e、 g在linux/gcc/intel cpu上,使用:gcc-S-masm=intel program_name.c
Good catch@iharob,如果您不介意的话,我会在我的答案中包括这一点。c语言中没有堆栈。这个词在标准中甚至没有出现过一次。堆也一样。这些概念没有一个是由C授权的,也没有用于每个实现。实际上,大多数现代实现并没有将所有自动变量存储在/a堆栈上。而s
是一个正常的自动变量。为什么您认为它的值存储在其他地方而不是其他地方?这完全是实现定义的。例如,PC甚至没有普通代码/数据的只读存储器。