Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中,为不可变字符串分配的内存在哪里?_C_Pointers_Memory Management_Dynamic Memory Allocation_String Literals - Fatal编程技术网

在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将消失

我试图理解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,就像在打开函数参数时一样,即使是一个字符是一个字节? 即使e只有一个字节,堆栈看起来会像这样吗

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

这不是c程序的布局吗?

它取决于您的平台,并且是由实现定义的。一般情况下,如果系统上有可用的话,它会转到只读存储器。阅读更多

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

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


顺便说一下,正如iharob所说:



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

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

  • 自动(
    b
  • 静态(
    “Hello world”
  • 动态(malloc(15)
分配的空间)
  • 线
  • 您在问题中询问的其他内容是特定编译器和平台的属性。有些设置没有堆栈和堆,没有数据段或.data或.bss节,等等

    进一步阅读:


    就在工具链放置的任何位置。这取决于体系结构、编译器、链接器等。。对于GCC,它很可能会转到
    .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甚至没有普通代码/数据的只读存储器。