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

c-更改字符数组元素时的未定义行为,c,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=

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

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

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

否,第9行不是未定义的行为。它将写入此数组:

char title1[]="The Name of the Rose";
它不是字符串文字(但由一初始化)。这样的普通数组可以根据您的喜好进行修改。如果您这样声明,情况会有所不同:

char *title1="The Name of the Rose";
未定义的行为在第10行,这里您将写入字符串文字,这是不允许的


顺便说一句,当你在这里提问时,请用一个最简单的例子来说明你的观点。您发布的大多数代码对您的问题完全没有用处。

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

char title1[]="The Name of the Rose";
它不是字符串文字(但由一初始化)。这样的普通数组可以根据您的喜好进行修改。如果您这样声明,情况会有所不同:

char *title1="The Name of the Rose";
未定义的行为在第10行,这里您将写入字符串文字,这是不允许的



顺便说一句,当你在这里提问时,请用一个最简单的例子来说明你的观点。您发布的大多数代码对您的问题完全没有用处。

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

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

您可以添加
书籍
类的定义吗?它未定义,因为您正在修改字符串文字常量(不是它的副本)。@JanDvorak您确定吗
book1.title
是对字符数组
title1
的引用,因此除非
Book
类的
title
元素是const-qualified(在这种情况下,代码不应编译),否则不会出现问题。现在,第10行并赋值给
book2.title
,它是对字符串文字的引用;那将是未定义的行为。这是C;C没有“构造函数”。我相当确定带有UB的行实际上是第10行,它修改了第二本书中的字符串,而不是第一个条目——这是完全允许的。我想可能只是行号上的一个计数错误。你怎么知道第9行给出了未定义的行为?你能添加
Book
类的定义吗?它未定义是因为你正在修改一个字符串文字常量(不是它的副本)。@JanDvorak你确定吗
book1.title
是对字符数组
title1
的引用,因此除非
Book
类的
title
元素是const-qualified(在这种情况下,代码不应编译),否则不会出现问题。现在,第10行并赋值给
book2.title
,它是对字符串文字的引用;那将是未定义的行为。这是C;C没有“构造函数”。我相当确定带有UB的行实际上是第10行,它修改了第二本书中的字符串,而不是第一个条目——这是完全允许的。我想可能只是行号上的计数错误。你怎么知道第9行给出了未定义的行为?
char title1[]
是一个数组,所以我不想修改字符串literal@Tom正如Jonathan Leffler指出的,第10行通过尝试修改字符串文字来调用UB是一个数组,所以我不想修改字符串literal@Tom正如Jonathan Leffler所指出的,第10行通过尝试修改字符串文字来调用UB?这个内存不是只读的吗?为什么它应该是只读的?只有使用
const
-限定符声明它时,它才会是只读的。字符串文字与此不同,它们不是应该更改的对象。我认为人们甚至应该说“它们是不应该更改的对象”。@Daniel,是的,应该这么说。所以更改驻留在全局代码中的数组元素也没关系?这个内存不是只读的吗?为什么它应该是只读的?只有使用
const
-限定符声明它时,它才会是只读的。字符串文字与此不同,它们不是应该更改的对象。我认为人们甚至应该说“它们是不应该更改的对象”。@Daniel,是的,应该这么说。