c - 更改char数组元素时的未定义行为

时间:2013-02-01 16:03:11

标签: c

以下代码的第9行生成未定义的行为。这是因为title1[]main()之外并且是全局的吗?或者是因为我缺少的其他东西?

1. char title1[]="The Name of the Rose";
2. Book book1={title1,900,0};
3. int main(){
4.   Book book2={"Foucault's Pendulum",1000,0};
5.   Book* book3=(Book*)malloc(sizeof(Book));
6.   *book3=book2;
7.   book1.next=&book2;
8.   book2.next=book3;
9.   book1.title[0]='B';
10.  book2.title[0]='A';
11.  {
12.    Book list[2];
13.    list[0]=book1;
14.    list[1]=book2;
15.    list[1].next->next=&book2;
16.    {
17.      Book* p=&list[0];
18.      while (p!=0) {
19.        p=p->next;
20.    }
21.  }
22. return 0;
23.}

编辑:

添加了图书定义:

‫;‪struct Book‬‬
‪typedef struct Book‬ {
‫;‪  char* title‬‬
  int pages;‬‬
‫;‪  struct Book* next‬‬
‫;‪} Book‬‬

3 个答案:

答案 0 :(得分:5)

不,第9行不是未定义的行为。它写入这个数组:

char title1[]="The Name of the Rose";

不是字符串文字(但由一个字母初始化)。这样的普通阵列可以根据自己的喜好进行修改。如果你这样宣布它会是不同的:

char *title1="The Name of the Rose";

未定义的行为在第10行,在这里你要写入一个字符串文字,这是不允许的。

顺便说一下,在这里提问时,请把它煮成一个显示你的观点的最小例子。您发布的大部分代码对您的问题都毫无用处。

答案 1 :(得分:0)

您正尝试修改第10行中的字符串文字。

答案 2 :(得分:0)

错误发生在第10行,因为字符串文字是常量,因此只读。任何写入都会导致错误。