2012-01-03 1 views
8

現在、動的に生成された配列の長さを取得しようとしています。これは、構造体の配列である:Cで動的に作成された構造体の配列の長さを取得する方法は?

typedef struct _my_data_ 
{ 
    unsigned int id; 
    double latitude; 
    double longitude; 
    unsigned int content_len; 
    char* name_dyn; 
    char* descr_dyn; 
} mydata; 

は、私はそのような私の配列intialize:

mydata* arr = (mydata*) malloc(sizeof(mydata)); 

をそしてのreallocを使用してそれをリサイズし、データとそれを埋めるために始めました。

次に、hereというコードを使用してサイズを取得しようとしました。

sizeof(arr)/sizeof(arr[0]) 

この操作は、私の配列は、2つの要素を含んでいてもを返します。

私が間違っていることを教えてもらえますか?

+0

になるだろうしているあなたは、プログラム手動で保存すること以外に、動的に割り当てられた配列のサイズを取得することはできませんサイズは可変で、センチネル値など –

答えて

14

動的に割り当てられた配列のサイズを知る必要がある場合は、それを自分で追跡する必要があります。

sizeof(arr)/sizeof(arr[0])の手法は、コンパイル時にサイズがわかっている配列に対してのみ、C99のvariable-length arraysに対してのみ機能します。

5

sizeofは、mallocを使用して動的に割り当てたメモリ容量を見つけることはできません。割り当てられたメモリチャンクへのポインタとともに、この番号を別々に保存する必要があります。さらに、reallocまたはfreeを使用するたびにこの番号を更新する必要があります。

+0

+1のOPの問題ですが、この答えは100%ではありません - あなたはmalloc()の方が正しいですが、C99の可変長配列は* 'sizeof'。 –

+0

@CarlNorum明確化のためにありがとう - 私は具体的に 'malloc'に言及する答えを更新しました。 – dasblinkenlight

2
mydata* arr = (mydata*) malloc(sizeof(mydata)); 

pointerないarrayです。 mydataの2つの項目のarrayを作成するには、第二次

mydata arr[2]; 

を行う必要があり、malloc()を使用してmydataの2つの要素を割り当てるために、次の手順を実行する必要があります。

mydata* arr = (mydata*) malloc(sizeof(mydata) * 2); 

OTOH、 (malloc()を使用して)動的に割り当てられたメモリの長さは、プログラマーが(変数内で)維持する必要があります - sizeof()はそれを追跡することができません!

1

かなりよく知られているトリックを使用して配列の要素数を調べようとしています。残念ながらarrではなく、の配列です。ポインタです。それでは、あなたのsizeof部門で取得していることである:

sizeof(pointer)/sizeof(structure) 

おそらく常に0

関連する問題