指针的分配和元素或结构的分配有什么区别?

时间:2012-08-05 11:42:40

标签: c pointers struct copy duplicates

我很难理解这两者之间的区别:

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

1 个答案:

答案 0 :(得分: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()没有任何意义。