2013-02-01 52 views
0

下面代码的第9行生成未定义的行为。这是由于title1[]main()之外的事实并且是全球性的吗?或者是因为我失踪的其他东西?c - 更改char数组元素时的未定义行为

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‬‬ 
+1

您可以添加“Book”类的定义吗? –

+5

它是未定义的,因为您正在修改字符串常量(不是它的副本)。 –

+0

是书结构中的第一个元素是一个指针吗? – MOHAMED

回答

5

号,9号线是不是不确定的行为。它写入此数组:

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

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

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

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

顺便说一句,当在这里问一个问题时,请把它做到一个最小的例子,显示你的观点。你发布的大部分代码对你的问题完全没用。

+0

因此可以更改驻留在全局代码中的数组的元素吗?这是不是只读内存? – Tom

+0

为什么它应该是只读的?只有在使用'const'限定符声明它时才会是只读的。字符串*文字*不同于它们,它们不是你应该改变的对象。 –

+0

我想人们甚至应该说“他们是你不是**应该改变的对象”。 –

0

您试图修改一个字符串在10行

+0

'char title1 []'是一个数组,所以我不想修改字符串文字 – Tom

+0

@Tom它是第10行,通过尝试修改字符串文字调用UB正如Jonathan Leffler指出的那样。 –

0

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

相关问题