【问题标题】:Where is memory allocated for an immutable string in c?c 中为不可变字符串分配的内存在哪里?
【发布时间】:2016-08-25 19:52:31
【问题描述】:

我试图了解在 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程序的布局吗?

【问题讨论】:

  • 就在您的工具链放置的任何位置。这取决于架构、编译器、链接器,什么不是……对于 GCC,它可能会转到 .rodata 部分,但它在物理上会在哪里……见上文。
  • 请阅读为什么不应该转换malloc() 的返回值。而且我认为您对堆栈的看法是正确的,但请注意没有chars,只有指针,指针为 4 或 8。 字符串文字 是代码中"hello world" 字符串的正确术语,应该在Data segment 中。它将是只读的。
  • 试着把它编译成程序集看看会发生什么。例如在 linux / gcc / intel cpu 上,使用:gcc -S -masm=intel program_name.c
  • 好消息@iharob,如果您不介意,我会将其包含在我的回答中。
  • C 语言中没有栈。这个词甚至没有在标准中出现一次。堆也一样。这些概念中没有一个是 C 强制要求的,也没有用于每个实现。实际上,大多数现代实现不会将所有自动变量存储在 /a 堆栈上。而s 是一个普通的自动变量。为什么你认为它的价值存储在其他地方而不是其他地方?

标签: c pointers memory-management dynamic-memory-allocation string-literals


【解决方案1】:

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

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

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


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


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

【讨论】:

  • 这是完全实现定义的。例如。 PC 甚至没有用于普通代码/数据的只读存储器。
【解决方案2】:

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

  • 自动 (b)
  • 静态 ("Hello world")
  • 动态(malloc(15)分配的空间)
  • 线程

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

进一步阅读:

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多