c中的不可变字符串的内存分配在哪里?

Where is memory allocated for an immutable string in c?

我正在尝试了解在 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 将消失,但内容的内存已永久分配。我的其他问题是堆栈指针总是向下移动 4,就像在推动函数参数时一样,即使在一个字节的 char 的情况下也是如此? 即使 e 只有一个字节,堆栈也会像这样吗?

30:// other stuff
26: g
22: f
18: e

http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png 这不是c程序的布局吗?

这取决于您的平台,它是实现定义的。一般情况下,它进入 只读内存,如果在您的系统上可用的话。阅读更多 here.

如您所述,当函数终止时,自动变量将消失,导致内存泄漏,但仅适用于您动态分配内存的情况

这意味着您必须让 func1() 与其调用者(例如 main())通信 temp,以便您稍后可以 free() 它。或者,如果您在函数完成其工作后不需要它,那么 free() 就在退出该函数之前。


顺便说一下,正如 iharob 所说:Do I cast the result of malloc? NO!


至于你的另一个问题,这应该是一个新问题,阅读this and this,他们可能会有所帮助。

在标准 C 术语中,有四种可能的存储持续时间:

  • 自动 (b)
  • 静态 ("Hello world")
  • 动态(space 由 malloc(15) 分配)
  • 线程

您在问题中询问的其他内容是特定编译器和平台的属性。一些设置没有堆栈,没有堆,没有数据段或 .data 或 .bss 部分,等等。

进一步阅读:

  • Where in memory are my variables stored in c?
  • storage class, storage duration, file scope, lifetime, linkage confusion