私は、少なくとも私が期待していなかった何か "C"の "奇妙な"動作に出くわしました。このコードの次の行を考える:(arrayB + 1)[1]
しかしarrayB
の第三の要素(従って、それは予想通り3印刷)配列内の矛盾するポインタ
ある*(arrayB+1 +1)
に変換されるよう
int arrayB[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
printf("%d\n", (arrayB+1)[1]);
これは正常に動作し、Iは初期化以下のコードを検討2DアレイはarrayA
このコードは、警告が発生しない
int ** arrayA = malloc(sizeof(int *) * 5);
for (int i = 0; i < 5; i++) {
arrayA[i] = malloc(sizeof(int) * 10);
for (int j = 0; j < 10; j++) {
arrayA[i][j] = j;
}
}
printf("%d\n", *(arrayA+1)[2]);
(各{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
、10個のintの5つのアレイを有する)と呼ばれ、そのを主張しますはint型です。
:しかし.. arrayA
がさらに後にこれが許容されることであるint **
あるので*(arrayA+1)[2]
は、タイプint *
である*(arrayA+3)
に変換し、(配列の添字は、間接参照演算子よりも高い優先順位を有するので)それがなければならないと思われます*(arrayA+1)[2] = 1;
これはどのように可能ですか?あたかもをint *
に割り当てているようですが、通常は警告が表示されます。
(はい、それは
exit
に自動的に解放されますが、各バイトを占める今の習慣に取得し、後で自分で悲しみを大幅に節約されますされます)これは*ありません* 2次元配列のみが不良ですそれのエミュレーションCにはネイティブの多次元配列があります。あなたの人生を不必要に複雑にしないでください。 –