C 是否将空指针复制到另一个空指针?

C 是否将空指针复制到另一个空指针?,c,pointers,malloc,heap-memory,void-pointers,C,Pointers,Malloc,Heap Memory,Void Pointers,我试图将一个空指针复制到另一个指针数组的不同索引,对于字符来说效果很好,但对于整数和双精度字符来说似乎存在问题 这是我的结构: typedef struct vector_struct { size_t e_sz; char e_type; #define V_INT 1 #define V_DOUBLE 2 #define V_CHAR 3 unsigned no_e; unsigned cur_cap; void* e_array; }* vector_type;

我试图将一个空指针复制到另一个指针数组的不同索引,对于字符来说效果很好,但对于整数和双精度字符来说似乎存在问题

这是我的结构:

typedef struct vector_struct {
 size_t e_sz;
 char e_type;

 #define V_INT 1 
 #define V_DOUBLE 2
 #define V_CHAR 3

 unsigned no_e;
 unsigned cur_cap;
 void* e_array;

}* vector_type;
 //for typecasting
  #define vector_int_at(v,i) (*((int*)v_at(v,i)))
  #define vector_double_at(v,i) (*((double*)v_at(v,i)))
  #define vector_char_at(v,i) (*((char*)v_at(v,i)))

  void* v_at(vector_type v, iterator i) {
    if ( v == NULL )
     fail("v_at() Error: no such vector");
    if ( i == iterator_end )
     i = v->no_e -1;
    if ( i < 0 || i >= v->no_e )
     fail("v_at() Error: no such element in this vector");
    return (v->e_array+i); //return element
   }
我这样调用这个函数:

c1 = 'o'; v_push_back(vc1,(void*)&c1); //for character
for ( i1 = 0 ; i1 < 10 ; i1++ ){ //for integer
    v_push_back(vi1,(void*)&i1);
}

//I call these like
  for ( i1 = 0 ; i1 < vector_size(vi1) ; i1++ )
   printf(" %ld",vector_int_at(vi1,i1));
  printf("\n");
c1='o';v_后推(vc1,(无效*)和c1)//为了性格
对于(i1=0;i1<10;i1++){//对于整数
v_向后推(vi1,(void*)和i1);
}
//我把这些叫做
对于(i1=0;i1<向量大小(vi1);i1++)
printf(“%ld”,向量在(vi1,i1)处);
printf(“\n”);
但似乎对整数不起作用,但对字符起作用,但对整数,垃圾值被复制,如下所示:

请帮帮我。谢谢

以下是完整的项目: 我看到的问题很少

  • 为了获得当前向量类型的第i个位置,需要将
    i
    v->e_sz
    相乘

    void* v_at(vector_type v, iterator i)
    {
        .....
        return ((char*)v->e_array+i*v->e_sz); //return element    
    }
    
  • 您正在分配
    sizeof(void*)
    您想要的是

     v->e_array = check_a(realloc(v->e_array, v->e_sz * v->cur_cap));
    
  • 同样,现在您将地址存储为
    int
    ,但需要存储其值

    void v_push_back(vector_type v, void* new_val){
         if(v->e_type==V_INT){
            //  (v->e_array+(v->no_e))=new_val;
            ((int*)v->e_array)[v->no_e]=*(int*)new_val;
                                        ^------storing its content
         }
    }
    
    没有任何类型检查,简单的
    memcpy
    应该可以工作

    void v_push_back(vector_type v, void* new_val){
        ....
        memcpy(
              v->e_array +(v->no_e)*v->e_sz,
              new_val,
              v->e_sz
              );
           //   *(char*)(v->e_array+v->no_e)=*(char*)new_val;
    
         (v->no_e)++;
     }
    

  • 阅读时,您是否播放
    e_数组
    ?如果是,怎么做?提供一个注释。@FaizanShah:不要在注释中添加代码。编辑问题以包含。请提供(强调完整)。可以复制/粘贴和编译的东西。链接ZIP文件中的代码与问题中的代码不匹配。在ZIP文件中,
    v_push_back
    包含
    if(v->e_type==v_INT){…
    。在问题中,它不包含。显然,人们永远不会期望通过询问代码Y来获得代码X不工作的正确答案。
    void v_push_back(vector_type v, void* new_val){
        ....
        memcpy(
              v->e_array +(v->no_e)*v->e_sz,
              new_val,
              v->e_sz
              );
           //   *(char*)(v->e_array+v->no_e)=*(char*)new_val;
    
         (v->no_e)++;
     }