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

标签 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 将消失,但内容的内存已永久分配。我的其他问题是堆栈指针总是向下移动 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!


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

关于c - c中的不可变字符串的内存分配在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39153686/

相关文章:

c - 函数调用结束时的数组销毁

iphone - UIButton setBackgroundImage 占用大量内存

c - 如何正确处理 C 中的 malloc 失败,尤其是当有多个 malloc 时?

ios - 查询sqlite数据库时内存分配不断增加

c - C语言头文件中

c - 为什么指针赋值在赋值看起来合适时显示左值错误?

python - 将数独解算器从 C 移植到 Python 时出现问题

C: 指针类型之间的非法转换:指向 const unsigned char 的指针 -> 指向 unsigned char 的指针

php - C函数substr、PHP扩展、strncpy长度错误

objective-c - NetBeans 无法识别 Makefile.am