2009-10-20 14 views
24

私は自分のプログラムのどこかで作成した構造体の配列を持っています。C配列を繰り返します。

後でそれを繰り返すが、私は配列のサイズは持っていない。

どのように要素を反復処理できますか?または、どこかにサイズを格納する必要がありますか?

答えて

18

サイズをどこかに格納することも、 "\ 0"が文字列の最後を示すのと同じ方法で、センチネルとして使う特別な値を持つ構造体を持つことができます。

+4

+1私は通常、構造体へのポインタを使用して、NULLがユニークなセンチネルであることを確かめることができます。 –

+5

null-terminated-stringモデルをフォローするのは悪い考えです。 – hasen

+0

@hasen j:毎回アレイ全体を繰り返し処理する必要があることが分かっていない限り、私は同意します。あなたはO(1)がやったであろうO(N)の行動で終わることができ、必ずしもそれを実現するとは限りません。 – quark

39

コンパイル時に配列のサイズがわかっている場合は、構造体サイズを使用して要素数を決定できます。

struct foo fooarr[10]; 

for(i = 0; i < sizeof(fooarr)/sizeof(struct foo); i++) 
{ 
    do_something(fooarr[i].data); 
} 

コンパイル時にわからない場合は、サイズをどこかに保存するか、アレイの末尾に特別なターミネータ値を作成する必要があります。

+3

あなたは速かったです!私は返信を編集していました:) – AntonioMO

+1

確かに、sizeof(struct foo)よりsizeof(fooarr [0]) 'または' sizeof(* fooarr) 'を使用したい – gatopeich

9

です。動的に割り当てられた配列、つまりmallocを呼び出して作成した場合は、配列/要素数をどこかに保存するか、またはセンチネル(特別な値を持つ構造体。最後の一つ)。

静的な配列の場合は、そのサイズ/要素のサイズを指定できます。それはグローバルでない限り、あなたはので、あなたの場合、それ以前別の関数に、配列を初期化する範囲でのみ動作は、それがポインタに減衰します

int array[10], array_size; 
... 
array_size = sizeof(array)/sizeof(int); 

注:たとえば。

希望します。

+1

動的に割り当てられるかどうか。これは配列型がポインタ型に崩壊するのを許しています。例えば、私は 'int(* a)[10] = malloc(sizeof * a)'のようにダイナミックに割り当てられた配列を作成し、 'sizeof * a/sizeof ** a'を使って後で要素の数を決定することができます。サイズを別々に保管する必要はありません。 – AnT

+7

+1、 'sizeof(array)/ sizeof(array [0])'を実行する方が好ましいです。このフォームでは、マクロを簡単に定義することもできます。 '#define ARRAY_COUNT(a)(sizeof(a)/(sizeof(a [0]))'になります。 –

+0

関数に渡すことについても同様です。それはあなたがどのようにそれを渡すかによって異なります。 – AnT

0

あなたはどこかにサイズを保存するべきだと思います。

配列の長さを決定するためのヌル終端文字列型のモデルは、悪い考えです。たとえば、配列のサイズを取得することは、O(N)になります。

このように言えば、良い解決策はglib's Arraysである可能性があります。追加のアイテムを追加する必要がある場合は、自動的に拡張するという利点があります。

P.S.正直言って、私はglibをあまり使っていないが、(非常に)評判の良い図書館だと思う。