2

char** の形式の文字列配列があります

その配列の長さを見つけるのに苦労しています:

typedef struct _stringArray
{
    int (*Length)(char**);
    char** (*Push)(char**, char*);
    char** (*Pop)(char**, char*);
}StringArray;

StringArray* StringArray_Constructor(void)
{
    StringArray* stringArray = (StringArray *)malloc(sizeof(StringArray));
    stringArray->Push = StringArray_Push;
    stringArray->Pop = StringArray_Pop;
}

char** StringArray_Push(char** array, char* string)
{
    int size = 0; //how to find how many elements in the array object???

    array = realoc(array, (sizeof(char *) * (size + 1));
    array[size] = string;
    return array;
}

どんな助けでも大歓迎です!ありがとう。

4

3 に答える 3

6

C では、これを自分で追跡する必要があります。

于 2011-04-13T01:02:46.903 に答える
2

配列の長さを推測する方法はありません。それを実行できる唯一の方法は、動的に実行することです。文字列の配列(char**)があるので、配列の最初の要素の最初の文字へのポインタがあります。Cでは、すべての文字列を「\ 0」で編集する必要があることは誰もが知っています。そのため、このポインタを取得して保存し、配列の文字列を「スキャン」して、「\0」が得られるまでインクリメントできます。次のポインタは、次の文字列の最初の文字などです。

しかし、これには大きな欠陥があります。メモリは見た目ほど線形ではありません。私が言っているのは、最初の文字列は、たとえばアドレス0x0010101Aに完全に割り当てることができ、次の文字列は0xF0FF0001に割り当てることができるため、巨大な文字列@ 0x0010101Aがあるか、それらの間に大量のデータがあり、わからないということです。それらが文字列の一部であるかどうか。

そのため、文字列の数のカウンターを維持する必要があります。:)

PS:そして、この数は常にゼロより大きいので、それunsigned intを入力するために使用する必要があります。

于 2011-04-13T01:16:29.077 に答える
2

いくつかのオプションがあります:

1) の現在のサイズを示すサイズ パラメータを渡しますchar **array

2) と結合する構造を宣言しますchar **array(int array_size実際には #1 と同じ)。

3) 配列に常に有効なポインター (つまり、非 NULL) が含まれる場合は、常に に設定される追加の要素を最後に作成しますNULLchar **arrayこれは配列ターミネータとして機能し、この終了要素を探してスキャンできます。

int size;

for (size = 0; array[size] != NULL; size++);

// 'size' is number of valid entries in 'array'.
于 2011-04-13T02:44:31.953 に答える