バッファがあり、バッファに十分な容量があるかどうかを確認するテストを実行したい。バッファに追加できる要素の数を見つけます。
char *buffer = (char *)malloc(sizeof(char) * 10);
やっている
int numElements = sizeof(buffer);
10を返さない
buffer
は、サイズ情報のない単なるポインタです。ただし、malloc()ルーチンは作成した割り当てのサイズを保持するため、free()を実行すると、適切な量のスペースが解放されます。したがって、malloc()機能を使いたくない場合は、割り当てのサイズを自分で保存することをお勧めします。 (可能な実装については、他のAPI回答の例を参照してください)。
GNU glibcの場合:
SYNOPSIS
#include <malloc.h>
size_t malloc_usable_size (void *ptr);
説明
Malloc_usable_size()関数は、ptrが指すブロック内の使用可能なバイト数、malloc(3)が割り当てたメモリブロックへのポインタ、または関連する関数を返します。
そのようなテストはできません。割り当てたメモリ量を覚えておくのはあなた自身の責任です。バッファが他の誰かから与えられた場合は、それらにもサイズ情報を渡すように要求し、正しい値を渡すか、プログラムを終了させるのは自分の責任にするようにしてください。
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を使用してください。間違いはありません。
sizeofは、メモリ内のオブジェクトのポインタではなく、実際のオブジェクトのサイズを計算するために使用されます。構造体またはプリミティブのサイズを返します。私はそれが機能することを意味しますが、それが指す構造ではなく、ポインターのサイズを提供します。任意の種類の配列の長さを取得するには、次を使用します。
strlen(バッファ)