1

プログラムで再利用したい配列に問題があります。サイズを動的に変更してクリアする必要があります。しかし、残念ながらサイズ変更は機能しません。

uint8_t * readBuffer; // Create array pointer

readBuffer = (uint8_t *) malloc(4); // Mem. alloc. 4bytes
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
....
readBuffer = (uint8_t *) malloc(1) // Mem. alloc. 1byte
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block

サイズ変更のステップでは、配列の長さはまだ前者 (4) です。

私はfreeすべて間違って使用していますか?

memsetさらに、クリアするためのはるかに効率的な代替手段はありますか?

前もって感謝します。

4

3 に答える 3

5

ポインターのサイズ (例: readBuffer) は、どのデータ型でも常に同じ (ここでは 4 バイト) です。malloc 内で指定されたサイズを一時的に格納してから使用する必要がありますmemset()

uint size = 4;
readBuffer = (uint8_t *) malloc(size); // Mem. alloc. 4bytes
memset(readBuffer, 0, size); // Reset array

また、 to の引数malloc()はバイト単位なので、malloc(1)理想的には 1 バイトを意味します。C++ を使用している場合は、次を使用しますnew

readBuffer = new uint8_t[N];  // 'N' is number of elements of "uint8_t"

編集

C++ では、std::vectorこの機能を非常に簡単に提供します。

std::vector<uint8_n> readBuffer(N, 0);

ここでは、「N」個の要素を に割り当てreadBufferて初期化してい0ます。
要素を追加したいときはいつでもpush_back()メソッドを使用できます。より大きなチャンクについては、resize()またはreserve()メソッドを探索することもできます。

于 2012-05-02T11:56:55.167 に答える
1
uint8_t * readBuffer; // Create array pointer

readBuffer = (uint8_t *) malloc(4); // Mem. alloc. 4bytes
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
....
readBuffer = (uint8_t *) malloc(1) // Mem. alloc. 1byte
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block

malloc のキャストは必要ありません。また、readBuffer にはサイズがありません。必要なのは sizeof(Uint8_t) * 4 です。これにより、適切なサイズが得られます。

また、malloc の代わりに realloc を使用する必要があります。これは、メモリ ブロックの既存のポインターを再割り当てするためです。this の戻り値は、新しいメモリ ブロックを指すか、ヒープに使用可能なメモリがない場合は NULL を指します。新しいコード:

uint8_t * readBuffer; // Create array pointer

readBuffer = malloc(4); // Mem. alloc. 4bytes
memset(readBuffer, 0, (sizeof(uint8_t) * 4)); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
....
uint8_t * temp = realloc(readBuffer, 1); // Mem. alloc. 1byte
if(temp != NULL) readBuffer = temp; //Check if their was enough room to allocate memory
memset(readBuffer, 0, (sizeof(uint8_t) * 4)); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
于 2012-05-02T12:44:29.380 に答える
1

サイズ変更のステップでは、配列の長さはまだ前者 (4) です。

問題は、によって割り当てられたメモリの量ではなく、ポインタsizeof(readBuffer)のサイズを返すことです。後者を追跡する場合は、自分で行う必要があります。malloc()

私はfreeすべて間違って使用していますか?

いいえ、free()正しく使用しています。

memsetクリアするためのはるかに効率的な代替手段はありますか?

もっと効率的な方法があるとは思えません。を使用してみることができますがcalloc()、これはmalloc()メモリをゼロで初期化します。

最後に、malloc()が を返したかどうかを確認することをお勧めしNULLます。これは、要求を満たすのに十分なメモリがない場合に実行できます。

于 2012-05-02T11:55:45.807 に答える