0

私はこれを持っています:

uint64_t **array;
int a;

if((array = malloc(8 * 25)) == NULL){
    errx(1, "malloc");
}

for(a = 0; a < 25; a++){
    if((array[a] = malloc(8 * (1 << a))) == NULL){
        errx(1, "malloc 1");
    }   
}

最悪のシナリオでは、2^a ビットを使用します。つまり、常に uint64_t を使用する必要はなく、uint も使用する必要があります。私の考えでは、< 8 には 1 バイト、< 16 および >=8 には 2 バイトを割り当て、この方法で 8 バイト (uint64_t) に割り当てます。

それは可能ですか?変数配列だけを使用してそれを行うにはどうすればよいですか?

4

1 に答える 1

0

これはおそらくコメント (または 3) である必要がありましたが、...

必要なバイト数を正確に把握することから始める必要があります (そして、何のために、その部分をカバーしていると思いますが)。

25とは?サイズが 8、16、32 ... 2^27 の 25 個の異なる配列にメモリを割り当てているのはなぜですか? これはサンプル コードかもしれませんが、マジック ナンバーである 25 にまだ戸惑っています。定数 (またはプリプロセッサ マクロ) の名前を使用することもできました。

8 はもう 1 つのマジック ナンバーであり、これも問題です。sizeof(*array)8になる保証はありません。

私もあなたの考えに少し混乱しています。現在のコードは、a=7 に 1024 バイトを割り当てます。プロトタイプで 1024 バイトを割り当てる必要があるとわかったものを格納するには、1 バイトで十分でしょうか?

于 2012-04-11T01:04:08.857 に答える