1

配列が C で初期化されているかどうかを知る方法は? 配列が空かどうか知りたくないので、 strlen() のような関数は役に立ちません。

4

2 に答える 2

5

実行時にそれをテストする方法はありません。初期化されていない配列は、ガベージで初期化された配列のように見えます。

何をしているかに応じて配列が実際に初期化されていることを確認するか、配列内の値がまだ意味があるどうかを示すフラグを明示的に渡す必要があります。

また、「配列が空かどうか」は、C ではあまり意味のある概念ではないことに注意してください。配列はただそこにあり、宣言されている要素を表すために必要なビット数が常に含まれています。これらのビットは意味のある値を持たないかもしれませんが、常にそこにあります。

于 2011-11-26T23:50:10.720 に答える
2

プログラム言語機能を使用することはできません。

ただし、設計と規律によって可能です。宣言時に、配列を NULL へのポインターとして設定します。次に、メモリと値の両方をポインターに割り当てる関数と、不要になったときに破棄する対応する解放関数を作成し、再度 NULL に設定します。そして、エラー状態として NULL をチェックするすべての関数を処理します。

境界認識を行うには、最後の要素を NULL に設定します。

例:

char* myArray=NULL;

/* other code */

myArray = createMyArray(n_elements);
memset(myArray,0,sizeof(int)*n_elements); /* Set the allocated memory to zero */

/* other code */

myArray[0]=functionReturningAString();
myArray[n_elements-1]=functionReturningAnotherString();

/* other code */

/*Processing*/
char* incr=myArray;
while( incr != NULL){
   processArray(incr);
   incr++;/* Increments by size of char pointer to the next pointer*/
}
free_Array(&myArray);/* this function calls free() and sets myArray to NULL*/

これは、多くの効率が必要な場合に使用できます。それ以外の場合は、独自の配列リストを作成するか、それを提供する既存のライブラリを使用する必要があります。

考えられるすべてのエラー状態を追跡するには、非常に多くの規律が必要になるため、面倒な作業になる可能性があります。

通常は、arraylist、linkedlist、HashSets などを提供するライブラリを使用するだけで十分です。CI の場合、これには多くの Glib 関数を使用します。

于 2011-11-27T00:59:17.060 に答える