c-更改字符数组元素时的未定义行为
下面代码的第9行生成未定义的行为。这是因为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=
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,是的,应该这么说。