C堆栈分配

时间:2011-10-05 09:50:09

标签: c stack memory-management

  

可能重复:
  Why does this Seg Fault?

堆栈分配是否为只读:

char* arr="abc";
arr[0]='c';

你能改变堆栈上分配的字符串吗?

3 个答案:

答案 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上以默认编译选项崩溃。)