使用char * string但不使用char字符串时出现分段错误[11]

时间:2013-01-05 17:56:25

标签: c pointers segmentation-fault

  

可能重复:
  Why do I get a segmentation fault when writing to a string?
  Why do I get a segmentation fault when I try to modify a string constant?

我正在尝试运行以下两个代码,我使用 file2.c 进行分段错误,但 file1.c 我没有犯任何错误。有人可以解释以下代码之间的区别:

file1.c

#include <stdio.h>

int main()
{
    int i;
    char  string[11] = {"HelloThere"};
    string[10] = '\0';
    for(i =0;i<5;i++)
    {
        string[i] = 'a';
    }
    printf("%s\n",string);
}

和:

file2.c中

#include <stdio.h>

int main()
{
    int i;
    char * string;
    string = "HelloThere";

    for(i =0;i<5;i++)
    {
        string[i] = 'a';    
    }
    printf("%s",string);

}

2 个答案:

答案 0 :(得分:3)

这是因为作业

char  string[11] = {"HelloThere"};

字符串常量复制到可写内存中,而

char * string = "HelloThere";

将其保留在只读内存中。虽然写入可写存储器是绝对可以的(呃!)写入只读存储器是未定义的行为,并且可能会触发崩溃。

请注意,除非要分配比字符串文字所需的内存更多的内存,否则不需要显式指定字符串的大小:

char  string[] = {"HelloThere"}; // <<== The size is empty

答案 1 :(得分:1)

string = "HelloThere";

然后

string[i] = 'a';

是错误的 - 您正在尝试修改字符串文字,但您不能。这会导致未定义的行为,因此任何事情都可能发生,包括崩溃。

然而,

char sring[11] = "HelloThere";

创建一个auto数组(在beforehands之前复制其中的字符串内容)并且这是可写的,允许修改它们的元素。