堆栈和文本中的内存分配?

时间:2015-11-13 06:57:10

标签: stackframe

考虑以下定义:

char A[]="xyz";

众所周知,当A定义如上时,A在堆栈部分中分配了4个字节的内存。同时将“xyz”的地址存储在代码部分中吗?

1 个答案:

答案 0 :(得分:1)

通常,在运行程序时,字符串文字存储在只读存储器中。这是为了防止您意外更改字符串常量。我所指的“只读内存”是ASM术语中的文本段。它是加载指令的内存中的相同位置。由于安全性等显而易见的原因,这是只读的。当您创建初始化为字符串的char*时,字符串数据将被编译到文本段中,程序会将指针初始化为指向文本段。因此,如果您尝试更改它,您将获得Segfault。但是,当编写为数组时(如示例所示),编译器会将初始化的字符串数据放在数据段中,这与全局变量等所在的位置相同。该内存是可变的,因为数据段中没有指令。这次编译器初始化字符数组(它仍然只是一个char *)时,它指向数据段而不是文本段,您可以在运行时安全地更改它。