0
#include <stdio.h>

int main(void) {
    int a[5], *p, i;
    p = a;
    p = (int []){1, 2, 3, 4, 5};
    for (i = 0; i < 5; i++, p++) {
        printf("%d == %d\n", *p, a[i]);
    }
    return 0;
}

見よ(YMMV):

$ gcc -O -Wall -Wextra -pedantic -std=c99 -o test test.c; ./test
1 == -1344503075
2 == 32767
3 == 4195733
4 == 0
5 == 15774429

ポインタ演算を介して配列を出力すると、実際に1〜5の整数シーケンスを保持していることがわかりますが、indecesを介して表現された同じ配列と思われるものを再度出力すると、初期化されていないがらくたになります。なんで?

4

5 に答える 5

4

に割り当てるだけで、に割り当てることpはないためaa初期化されることはありません。

int a[5], *p, i;
// a uninitialized, p uninitialized
p = a;
// a uninitialized, p points to a
p = (int []){1, 2, 3, 4, 5};
// a uninitialized, p points to {1, 2, 3, 4, 5}
于 2011-12-14T15:30:27.043 に答える
2

aの要素を初期化することはありません。ポイントをp変更するための両方の割り当て。pどちらの割り当ても、aまたはその要素に対して何もしません。

于 2011-12-14T15:30:43.103 に答える
1

aの値をに割り当て、pすぐ別のint配列の値でオーバーライドします。で、メモリ内の同じ場所を参照printf("%d == %d\n", *p, a[i]) *pa[i]なくなり、初期化されaないままになります(したがってガベージ)。

于 2011-12-14T15:31:56.500 に答える
0

配列ポインタに割り当てているので、データを配列にコピーしません。したがって、一方のソースからデータを取得し、もう一方のソースからゴミを取得します。

于 2011-12-14T15:30:36.167 に答える
0

あなたのコードはこれと同等です:

int a[5];
int b[5] = { 1, 2, 3, 4, 5 };

for (i = 0; i < 5; i++)
    printf("%d == %d\n", b[i], a[i]);

は初期化されていないためa、予測できない値が得られます(実際、これらの変数を読み取ることは未定義の動作です)。

于 2011-12-14T15:33:06.827 に答える