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
与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)++;
}