0

私はこれら2つの違いを理解するのに苦労しています:

typedef struct someStruct{
   int x;
   char *name;
   struct someStruct *next
}TEST1,*pTEST1;

void *copyElement(void* s){
   pTEST1 cop = (pTEST1)calloc(1,sizeof(TEST1));
   cop = (pTEST1)s;
}

これは、私が間違っていない場合は同じ要素を指しているので、1つを変更すると、すべてのポイントされた要素が変更されます

メモリー内の新しい「場所」に要素の新しいコピーを作成し、それをポイントしたいと思います。

説明を取得したいと思います。

私が得られないもう一つのことは、ポインタの割り当てスペースとオブジェクト自体の違いです。

たとえば、自分の関数を取得してそれを実行すると、次のようになります。

void *copyElement(void* s){
    pTEST1 cop = (pTEST1)calloc(1,sizeof(TEST1));
    cop = (pTEST1)s;
    /*or */
    TEST1 a;
    pTEST1 b;
    a.x  =(pTEST1)s->x;
    a.name = (pTEST1)s->name;
    a->next = (pTEST1)s->next;

    b= &a ;
    // it means the when the function ends,
    // I loose the pointer ? because I didn't
    // allocate space for it?
}
4

1 に答える 1

1

pTEST1識別子は単なるタイプ名のエイリアスであり、「TEST1構造体へのポインタ」を意味します。一部のCプログラマーはそれを誓いますが、ポインターを非表示にし、それらを逆参照する必要があるときに明確にしないため、悪だと考える人もいます。これはまさにあなたのコードの何が悪いのか、あなたは実際に構造をコピーしたのではなく、ポインタをコピーしただけです。適切なバージョンはこれに似ているはずです:

void *copyElement(void *s){
   // Copies element pointed-to by "s".  NOTE: free() required on the returned pointer
   TEST1 *copy = malloc(sizeof(TEST1));
   *copy = *(TEST1*)s;
   return copy;
}

本当にpTEST1を使用したい場合は、上記のスニペットのTEST1*をそれに置き換えてください。とにかく割り当てられたメモリを上書きする場合は、calloc()を使用しても意味がないことに注意してください。

于 2012-08-05T12:20:17.087 に答える