2012-05-17 9 views
7

私はバッファを持っており、バッファが十分な容量を持っているかどうかを調べるためにテストを行いたいと考えています。バッファに追加できる要素の数を見つけます。割り当てられたCバッファのサイズを調べる方法は?

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

int numElements = sizeof(buffer); 

は10を返しません。私はこれを実現する方法上の任意のアイデアをやって?

答えて

3

bufferはサイズ情報のないポインタです。しかし、malloc()ルーチンは割り振りのサイズを保持していますので、free()したときに空き領域が解放されます。したがって、malloc()の機能を習得しない限り、割り当てのサイズを自分で保存することをお勧めします。 (可能な実装については、他のAPIの回答の例を参照してください)。

11

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

6

bufferはポインタ(配列ではない)なので、ポインタのサイズではなくポインタのサイズを返します。ポインタのサイズは返しません。あなた自身簿記しなければならないので、このサイズを決定する標準的な方法は、ありません(つまり、あなたが割り当てられたどのくらい覚えています。)

ところで

、それは、

興味深いことに
char *p = "hello, world\n"; /* sizeof p is not 13. */ 

ため

sizeof "hello, world\n" 
同じです

は14です。あなたはその理由を推測できますか?

+12

あなたは本当に質問者に質問を送っていますか?それは実際に私たちがここにいる理由ではありません... – Evert

+0

@Jensまあ私はsizeof()が文字列リテラルと配列の正しいサイズを返すことを知っていますが、なぜですか?サイズ情報はどこに保存されていますか?たとえば、char * p = "hello"はポインタのサイズを、char p [10]は10のサイズを与えます。 – Zebrafish

+0

@Evert私たちは答えを得るためにここにおり、彼は答えを出しました。フォローアップの疑問を提起することは正当な教育装置である。さらに、私は彼の質問に対する答えが彼がちょうど与えた答えであるので、彼の質問は批判を是認しないと思うので、彼は本当に情報を隠すわけではありません。私は、 "読者のための運動"などを残して効能や価値を議論することができると思いますが、この場合は非常に簡潔で適切です。 –

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

+0

もしあなたが本当に巧妙になりたいのであれば、システムmallocを使って4バイトの余分なバイトを割り当て、そこに割り当てられた長さを格納し、この長さの後にポインタを返す独自の 'malloc 'を書くことができます。次に、ポインタの算術演算を使ってこれを再び取得する 'getSize'メソッドを持つことができます。 'malloc'や' free'のような呼び出しを使うことができます。 –

+0

私はそれが賢明であるとは確信していません - あなたの個人的なmallocは、今や皆のelsesとその行動が異なります。私は、コア機能の振る舞いを調整するビューが危険な状態になっています。それは他のすべての根底にある。 –

+1

私は1つの会社を知っていました。割り当てられたすべてがフリーリストに追加されるように、オーバーロードされたmallocがありました。実際にどのように実装されたのか(実際の考え方がどれほど悪いかを考慮すると驚くにはあたらない)、コードに深く組み込まれているため、決して削除することはできません。 –

0

sizeofは、メモリ内のオブジェクトのポインタではなく、実際のオブジェクトのサイズを計算するために使用されます。構造体またはプリミティブのサイズを返します。私はそれが動作することを意味しますが、それが指す構造ではなく、ポインタのサイズを与えるでしょう。

STRLEN GNUのglibc向け(バッファ)

+0

strlen()の使用は文字列(NULバイトで終わる)に対してのみ機能します。一般的に、 'strlen'は' '配列の長さ ''を与える​​ことは期待できません。実際、それはもう一方の方法です: 'sizeof' **はあなたに配列の任意の種類のサイズを与えます**。 – Jens

+0

だから、正しい方法は次のようになります:sizeof(* buffer)? – SpaceBear

+0

いいえ、宣言が 'char * buffer'なので、' sizeof * buffer'は 'sizeof char'です。これは1です。malloc/callocの呼び出し方法を覚えておく以外に、動的に割り当てられたバッファのサイズを決める方法はありません/ realloc。しかし**配列**のように 'char foo [N]'のように宣言された場合、 'sizeof foo'は' N'です。 – Jens

19

SYNOPSIS 

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

DESCRIPTION

malloc_usable_size()関数アレイ用の任意の種類の長さを取得しますptrが指すブロック内の使用可能バイト数、malloc(3)によって割り当てられたメモリブロックへのポインタ、または関連する機能

+0

注:これはmallocの実装に依存するため、重大なオーバーヘッドにつながる可能性があります。そして、割り当てられたバイト数を返します。利用可能な要素の数を取得するには、追加の除算が必要です。 manは明らかに "malloc_usable_size()によって返される値は、整列と最小サイズの制約のため、要求された割り振りサイズより大きくなる可能性があります。余分なバイトは悪影響を及ぼすことなくアプリケーションによって上書きされますが、プログラミングの実践**:割り当て内の超過バイトの数は、基礎となる実装に依存します。 – Stargateur

関連する問題