3

次のコードでは、次のような出力があります(最後のコードはセグメンテーション違反を示しています)

 U   
 s    
 HelloThisisatest    
 Segmentation fault (core dumped)

しかし、私はその理由がわかりません。コードは

int main()
{
   char *a[]={"Hello" "This" "is" "a" "test"};
   printf("%c\n",a[1][0]);
   printf("%c\n",a[0][8]);
   printf("%s\n",a[0]);
   printf("%s\n",a[3]);
   return 0;
}

もう1つの質問は、コンマを使用せずに2次元配列を初期化できるかどうかです。\nsをsに置き換えると、\t出力が次のように変化するという別の状況が発生しました

「私たちのHelloThisisatest(null)」

なぜ?

4

3 に答える 3

11

これは、Cでは、2つの隣接する文字列が1つに連結されているためです。つまり、「Hello」「World」は実際には単一の文字列「HelloWorld」です。

  • あなたの場合、ポインタの配列には実際には1つの文字列「HelloThisisatest」が含まれています。最初のprintfでは、場所1にアクセスしていますが、これは未定義の動作です。

  • 次のprintfは、文字列の文字8にアクセスしますs

  • 3番目のprintfは、0「HelloThisisatest」という場所に格納されている文字列全体を出力します。

  • 最後のprintfは、初期化されていないため、未定義の動作である配列位置3にアクセスしようとします。

編集

C11/C99標準のセクション5.1.1.2パラグラフ6を参照してください。

隣接する文字列リテラルトークンは連結されます。

于 2012-09-29T04:31:22.930 に答える
1

あなたはこれをしたいかもしれません:

char a[][20] = {"Hello", "This", "is", "a", "test"};

202番目の次元のサイズは( )である必要があることに注意してください

これで、すべての単語を印刷できます。

printf("%s\n",a[0]);
printf("%s\n",a[1]);
printf("%s\n",a[2]);
printf("%s\n",a[3]);
printf("%s\n",a[4]);
于 2012-09-29T07:53:28.503 に答える
1

charへのポインタの配列があります。ただし、そのようなポインタは1つしかないため、次のようにコーディングします。

a[1][0]

配列をオーバーランします。この特定の配列では、最初のインデックスは常に0である必要があります。

于 2012-09-29T04:33:02.900 に答える