バッファーがあり、バッファーに十分な容量があるかどうか、つまりバッファーに追加できる要素の数を確認するテストを行いたいと考えています。
char *buffer = (char *)malloc(sizeof(char) * 10);
する
int numElements = sizeof(buffer);
は 10 を返しません。これを達成する方法についてのアイデアはありますか?
バッファーがあり、バッファーに十分な容量があるかどうか、つまりバッファーに追加できる要素の数を確認するテストを行いたいと考えています。
char *buffer = (char *)malloc(sizeof(char) * 10);
する
int numElements = sizeof(buffer);
は 10 を返しません。これを達成する方法についてのアイデアはありますか?
GNU glibc の場合:
SYNOPSIS
#include <malloc.h>
size_t malloc_usable_size (void *ptr);
説明
malloc_usable_size() 関数は、ptr が指すブロック内の使用可能なバイト数、malloc(3) または関連する関数によって割り当てられたメモリ ブロックへのポインタを返します。
そのようなテストを行うことはできません。割り当てたメモリ量を覚えておくのは、自分の責任です。バッファが他の人から渡された場合は、サイズ情報も渡すように要求し、正しい値を渡すか、プログラムを終了させる責任を負います。
buffer
サイズ情報を持たない単なるポインタです。ただし、malloc() ルーチンは、作成した割り当てのサイズを保持するため、free() すると、適切な量のスペースが解放されます。そのため、malloc() 機能に飛び込みたくない場合は、割り当てのサイズを自分で保存することをお勧めします。(可能な実装については、他の API の回答の例を参照してください)。
buffer
はポインター (配列ではない) であるため、この演算子sizeof
はポインターが指すバッファーのサイズではなく、ポインターのサイズを返します。このサイズを決定する標準的な方法はないため、自分で簿記を行う必要があります (つまり、割り当てた金額を覚えておいてください)。
ところで、それは同じです
char *p = "hello, world\n"; /* sizeof p is not 13. */
興味深いことに、
sizeof "hello, world\n"
は 14 です。理由がわかりますか?
struct buffer
{
void
*memory
size_t
length;
};
void *buffer_allocate( struct buffer *b, size_t length )
{
assert( b != NULL );
b->memory = malloc( length )
b->length = length;
// TRD : NULL on malloc() fail
return( b->memory );
}
int buffer_valid( struct buffer *b, size_t length )
{
assert( b != NULL );
if( b->memory == NULL or length > b->length )
return( 0 );
return( 1 );
}
void *buffer_get( struct buffer *b )
{
assert( b != NULL );
return( b->memory );
}
malloc/free ではなく API を使用すれば、間違いはありません。