2012-08-05 45 views
0

我在理解這些兩者之間的區別麻煩:指針分配和元素或結構分配有什麼區別?

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; 
} 

這一個,如果我沒有記錯指向同一元素上,所以如果我改變了一個,所有的尖頭構件將改變

我想創建一個元素的新副本,在內存中的新「位置」並指向它。

很想得到解釋。

我沒有得到的另一件事是指針的分配空間和對象本身之間的區別。

例如,如果我把我的功能,做到這一點:

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? 
} 
+0

你的代碼非常困惑,充滿了泄漏,最終沒有做任何事情。你想解決什麼問題? – 2012-08-05 12:08:52

回答

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()沒有意義。