0

重複の可能性:
c の動的メモリ割り当てと sizeof()

16 MiB の巨大なブロックを保持し、時間を見つけるために毎回異なる要素にアクセスしようとすることで、キャッシュ ブロックを見つけようとしています。配列の長さを書き込めません。配列を反復処理する for ループを作成するにはどうすればよいですか。配列の長さが必要です。どうすればそれを見つけることができますか? 私は試しsizeof(a)/sizeof(a[0])ましたが、これはうまくいかないか、割り当てシートに 400 万を保持できると記載されているため、何か間違ったことをしていintます..

register *a;
a = malloc(16777216);
int i;
for (i = 0; i < sizeof(a)/sizeof(a[0]); i = i + 1) {

    printf("\ni = %d", i);
}

これは i = 0 i = 1 のみを出力します。

4

2 に答える 2

1

コードsizeof(a)はポインタのサイズを返すだけで、指すregister *a配列のサイズとはまったく関係ありませんa

C 配列は、含まれているアイテムの数を追跡しません。この構文は、配列のサイズがコンパイル時にわかっている場合にのみ使用できます。ただし、この方法で割り当てられた配列ではできません。

このタスクでは、この情報を自分で追跡する必要があります。その値を変数に格納するか、配列の末尾であることを示す特別な値を配列要素に追加することができます (C 文字列の場合と同様)。

于 2012-12-11T03:40:26.117 に答える
0

a は配列ではなくレジスターポインターです。そのため、 sizeof(a) は期待どおりに 16MB を返しません。sizeof() の代わりに 16777216 を直接使用してください

于 2012-12-11T03:41:30.667 に答える