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";

これは文字列リテラルではありません(ただし、1つで初期化されます)。このような単純な配列は、好みに合わせて変更できます。あなたがそれをこのように宣言したならば、それは異なっていただろう:

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

未定義の動作は10行目にあります。ここでは、文字列リテラルに書き込んでいますが、これは許可されていません。

ところで、ここで質問をするときは、あなたのポイントを示す最小限の例にそれを調理してください。あなたが投稿したコードのほとんどはあなたの質問には完全に役に立たない。

于 2013-02-01T16:17:20.207 に答える
0

文字列リテラルは定数であり、したがって読み取り専用であるため、エラーは10行目で発生します。書き込みを行うとエラーが発生します。

于 2013-02-01T16:26:31.713 に答える
0

10行目の文字列リテラルを変更しようとしています。

于 2013-02-01T16:10:49.823 に答える