11

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

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

する

int numElements = sizeof(buffer); 

は 10 を返しません。これを達成する方法についてのアイデアはありますか?

4

5 に答える 5

26

GNU glibc の場合:

SYNOPSIS

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

説明

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

于 2013-07-11T19:34:04.567 に答える
17

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

于 2012-05-17T16:30:34.530 に答える
8

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

于 2012-05-17T16:37:16.380 に答える
5

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

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

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

興味深いことに、

 sizeof "hello, world\n"

は 14 です。理由がわかりますか?

于 2012-05-17T16:33:12.030 に答える
2
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 を使用すれば、間違いはありません。

于 2012-05-17T16:37:31.220 に答える