web-dev-qa-db-ja.com

割り当てられたCバッファーのサイズを決定する方法は?

バッファがあり、バッファに十分な容量があるかどうかを確認するテストを実行したい。バッファに追加できる要素の数を見つけます。

char *buffer = (char *)malloc(sizeof(char) * 10);

やっている

int numElements = sizeof(buffer); 

10を返さない

10
godzilla

bufferは、サイズ情報のない単なるポインタです。ただし、malloc()ルーチンは作成した割り当てのサイズを保持するため、free()を実行すると、適切な量のスペースが解放されます。したがって、malloc()機能を使いたくない場合は、割り当てのサイズを自分で保存することをお勧めします。 (可能な実装については、他のAPI回答の例を参照してください)。

6
Evert

GNU glibcの場合:

SYNOPSIS

#include <malloc.h>
size_t malloc_usable_size (void *ptr);

説明

Malloc_usable_size()関数は、ptrが指すブロック内の使用可能なバイト数、malloc(3)が割り当てたメモリブロックへのポインタ、または関連する関数を返します。

23
Vitaly

そのようなテストはできません。割り当てたメモリ量を覚えておくのはあなた自身の責任です。バッファが他の誰かから与えられた場合は、それらにもサイズ情報を渡すように要求し、正しい値を渡すか、プログラムを終了させるのは自分の責任にするようにしてください。

13
Kerrek SB

bufferはポインター(配列ではない)であるため、sizeof演算子はポインターが指すバッファーのサイズではなく、ポインターのサイズを返します。このサイズを決定する標準的な方法はないため、自分で簿記を行う必要があります(つまり、割り当てた量を覚えておいてください)。

ところで、それは同じです

 char *p = "hello, world\n"; /* sizeof p is not 13. */

興味深いことに、

 sizeof "hello, world\n"

14です。なぜでしょうか。

7
Jens
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を使用してください。間違いはありません。

1
user82238

sizeofは、メモリ内のオブジェクトのポインタではなく、実際のオブジェクトのサイズを計算するために使用されます。構造体またはプリミティブのサイズを返します。私はそれが機能することを意味しますが、それが指す構造ではなく、ポインターのサイズを提供します。任意の種類の配列の長さを取得するには、次を使用します。

strlen(バッファ)

0
SpaceBear