C堆栈分配
答
没有分配在堆栈上,它是一个字符串文字。
不,你不能修改它。您的编译器可以将该字符串放在只读内存段中(如果您的实现有这样的概念)。试图改变它导致未定义的行为。
(它崩溃的Linux上使用缺省的GCC编译实例的选项。)
答
字符串不是在堆栈中。指向它的指针(arr
)是。修改字符串文字是未定义的行为。
您可以在ASM GCC很清楚地看到这产生于86:
.file "test.c"
.section .rodata
.LC0:
.string "abc" ; String literal inside .rodata section
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $.LC0, -4(%ebp) ; Pointer to LC0 (our string onto stack)
movl -4(%ebp), %eax ; Pointer is copied into eax register
movb $99, (%eax) ; Copy $99 ('c') to what eax points to (in .rodata)
答
您的代码不会在栈上分配一个字符串。它在堆栈上分配一个char*
,也就是指针,它使指针指向字符串文字。尝试修改字符串文字是未定义的行为。
要分配字符串在栈上,做到:
char arr[] = "abc";
现在你已经采取了串您的堆栈分配的数组arr
在文本的副本,你可以修改该副本。
对于完整的步骤:我所描述的“栈分配”技术上都是“自动变量”。 C本身并不关心它们被分配的位置,但我可以猜测出你的实现确实把它们放在堆栈上。
http://*.com/questions/2036096/literal-string-initializer-for-a-character-array – kan