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!
在标准 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
我正在尝试了解在 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!
在标准 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