3

Cのリンクリストから汎用データを削除する次の関数があります。

void removeData(void *data, struct accList *theList)
{
    struct accListNode* cur = theList->head;
    struct accListNode* prev = NULL;

    for(; cur != NULL; prev = cur, cur = cur->next)
    {
        if(cur->data == data)
        {
            if(cur == theList->head)
            {
               theList->head = cur->next;
            }
            if(cur == theList->tail)
            {
                theList->tail = prev;
            }
            if(prev != NULL)
            {
                prev->next = cur->next;
            }
            free(cur);
            return;
        }
    }
}

背後にある意味は何cur->data == dataですか?

私のデータはジェネリック(void*)なので、これはプリミティブ型と構造型にとって何を意味しますか?

たとえば、従業員の構造を考えてみましょう。

struct employee
{
    char name[20];
    float wageRate;
};

cur->data == dataデータがタイプの場合、ステートメントはどのように機能しstruct employee*ますか?データは構造体の最初のメモリアドレスへのポインタなので、ポインタアドレスを比較するだけですか?

4

4 に答える 4

7
cur->data == data

cur->dataポインタをポインタと比較しますdata。アドレスではなく、値を比較しています。ポインタは他の変数と同じです。アドレス(つまり、&some_ptr)と値(つまり、参照するもののアドレス)があります。

他のタイプの比較(つまり、< > >= <=)は、ポインターが同じ配列の要素または終わりを過ぎた要素を指している場合を除いて、未定義の動作をもたらすことに注意してください(存在する「オブジェクト」を指していることがわかっていない限り、そうすることは意味がありません)。とにかく、連続したメモリの同じチャンクにありますが、それでも)。

于 2012-06-29T22:15:19.427 に答える
3

cur-> data == dataの背後にある意味は何ですか?

コードは、両方のポインターが同じポインターであることを確認しています

私のデータはジェネリック(void *)なので、これはプリミティブ型と構造型にとって何を意味しますか?

データがstructemployee*型の場合、ステートメントcur-> data == dataはどのように機能しますか?

何も、比較は同じように機能します

データは構造体の最初のメモリアドレスへのポインタなので、ポインタアドレスを比較するだけですか?

いいえ、ポインタを比較しています

于 2012-06-29T22:21:55.323 に答える
2

指示された構造体ではなく、ポインタ自体を比較しています。

于 2012-06-29T22:15:43.347 に答える
0

removeData()を書かなかったと思いますか?そうでない場合、私の説明は次のとおりです。

removeData()は、コンテンツが* dataに等しいエントリではなく、リンクリストから特定のエントリ(つまり* data)を削除するように設計されています。したがって、removeData()の呼び出し元は、free()されたいエントリがどこにあるかをすでに正確に知っている必要があります。彼らはそれ自体をfree()することもできますが、リンクリストにはまだそれへのポインタが含まれているため、それは良くありません。おそらく、リンクリストの他のユーザーは、free()されたオブジェクトがまだ有効であると考えるでしょう(他の方法で信じる理由はありません。そのように伝える他のスキームがない場合)。

内容が*dataの内容と一致する(ただし* dataと同じメモリにはない)エントリをリストで検索する関数が必要な場合は、そのようなタイプごとにremoveData()のバージョンを作成する必要があります。また、accListは同種(そのタイプのすべてのオブジェクトを含む)である必要があります。そうでない場合、accListには、おそらく列挙型として、各エントリのタイプの表示と、removeData()の各バージョン(タイプごとに1つ)も含まれている必要があります。 )それ自体のタイプと一致しない要素をスキップする必要があります。

于 2012-06-30T00:20:26.870 に答える