0

以下代码的第 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‬‬
4

3 回答 3

5

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

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

这不是字符串文字(但由一个初始化)。这样一个普通的数组可以根据自己的喜好进行修改。如果您像这样声明它会有所不同:

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

未定义的行为在第 10 行,在这里您正在写入字符串文字,这是不允许的。

顺便说一句,当在这里提出问题时,请将其简化为一个能说明您观点的最小示例。您发布的大多数代码对您的问题完全没有用。

于 2013-02-01T16:17:20.207 回答
0

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

于 2013-02-01T16:10:49.823 回答
0

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

于 2013-02-01T16:26:31.713 回答