答案 0 :(得分:7)
字符串"abc"
不在堆栈中。指向它的指针(arr
)是。修改字符串文字是未定义的行为。
你可以在asm GCC上生成的x86上清楚地看到这一点:
.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)
答案 1 :(得分:5)
您的代码不会在堆栈上分配字符串。它在堆栈上分配char*
,也就是说指针,它使该指针指向字符串文字。尝试修改字符串文字是未定义的行为。
要在堆栈上分配字符串,请执行以下操作:
char arr[] = "abc";
现在您已经在堆栈分配的数组arr
中获取了字符串文字的副本,并且您可以修改该副本。
对于完整的迂腐:我所描述的所有“堆叠分配”在技术上都是“自动变量”。 C本身并不关心它们的分配位置,但我可以非常自信地猜测你的实现确实会将它们放在堆栈中。
答案 2 :(得分:3)
"abc"
未在堆栈上分配,它是一个字符串文字。
不,你不能修改它。您的编译器可以将该字符串放在只读内存段中(如果您的实现具有这样的概念)。试图改变它会导致不确定的行为。
(例如,它在带有GCC的Linux上以默认编译选项崩溃。)