c - 指针分配与元素或结构分配有什么区别?

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

最佳答案

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() 是没有意义的。

关于c - 指针分配与元素或结构分配有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816103/

相关文章:

c - 每次运行代码时都会生成不同的输出

ios - 如何检查 id 是否指向 CGRect?

c - 结构数组中的 strstr 字符数组

c - 为什么 C 静态函数不进入文本部分而是进入 rodata 部分?

c - 在Postgresql扩展C中获取用户定义的类型OID

c - GLib:哈希表无法正确找到值

c - 如何使结构体指向不同的字符串?

c - C中使用anArray++等表达式时数组和指针的区别

C++ 指向函数的指针作为参数。数据类型不兼容

c++ - 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?