2

unsignedshortの配列を使用するbigIntデータ型を作成しています。一部の関数では、最上位のshortが使用される場合と使用されない場合がありますが、念のため常に割り当てられます。基本的な数学演算による無限のメモリ消費を防ぐために、配列を次のように再割り当てしたいと思います。

toReturn.numArray = realloc(toReturn.numArray, (sizeof(unsigned short)) * (toReturn.numElements - 1))

しかし、最上位ビットが解放される(理想的)のか、最下位ビットが解放されるのかはわかりません。

4

4 に答える 4

3

ダウンサイジング中に、一部の (ダウンサイズされた) メモリが解放されて同じメモリ ブロックが返されるという保証はありません。単に保証されていないため、それに依存するべきではありません。

C99 標準 7.20.3.4-1: realloc 関数:

realloc 関数は、ptr が指す古いオブジェクトの割り当てを解除し、 size で指定されたサイズを持つ新しいオブジェクトへのポインタを返します。新しいオブジェクトの内容は、新しいサイズと古いサイズの小さい方まで、割り当て解除前の古いオブジェクトの内容と同じでなければなりません。古いオブジェクトのサイズを超える新しいオブジェクトのバイトは、不確定な値を持ちます。

于 2013-03-20T15:41:35.337 に答える
1

from 'man realloc()'

 The realloc() function changes the size of the block pointed
 to by ptr to size bytes and returns a pointer to the (possi-
 bly moved) block. The contents will be unchanged up  to  the
 lesser  of  the  new  and  old sizes.
于 2013-03-20T15:46:09.613 に答える
1

メモリ ブロックが再配置される場合、データは古いバッファの下部から新しいサイズまでコピーされます。

データの先頭を保持したい場合は、malloc/memmoveまたは同様の操作を行う必要があります。

これがビットにどのように関係するかは、データをブロックにどのようにマップするかによって異なります。これは制御可能でなければなりません。

于 2013-03-20T15:38:28.537 に答える
0

わかりました、私はばかばかしていました。

配列 = realloc(配列、smallerSizeNumber);

array[0] を array[smallerSizeNumber - 1] に保持します。

上位ビットは失われます。

于 2013-03-20T15:48:37.160 に答える