将 void 指针复制到另一个 void 指针?
copying void pointer to another void pointer?
我正在尝试将一个空指针复制到另一个指针数组的不同索引,对于字符来说一切正常,但整数和双精度出现问题
这是我的结构:
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
}
我想将值复制到 void* e_array
中,它可以是整数、字符或双精度值。
void v_push_back(vector_type v, void* new_val){
if ( v->no_e >= v->cur_cap ) {
/*** need to expand the array ***/
v->cur_cap += (v->cur_cap)? v->cur_cap : 2;
v->e_array = check_a(realloc(v->e_array, sizeof(void*) * v->cur_cap));
//allocate memory
}
/*** copy new_val into the array at end position (v->no_e) ***/
printf("%d %d %p\n",v->e_sz,v->no_e,v->e_array+(v->no_e *v->e_sz));
memcpy(
v->e_array +(v->no_e)*v->e_sz,
new_val,
v->e_sz
);
(v->no_e)++;
}
我是这样调用这个函数的:
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");
但它似乎不适用于整数但适用于字符但对于整数垃圾值被复制如下所示:
enter image description here
请帮帮我。谢谢
这里是完整的项目:
https://s3.amazonaws.com/assignment.pointers.vectorc.implementation/C-VectorImplementation1.zip
我看到的问题很少,
为了获得当前矢量类型的第 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)++;
}
我正在尝试将一个空指针复制到另一个指针数组的不同索引,对于字符来说一切正常,但整数和双精度出现问题
这是我的结构:
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
}
我想将值复制到 void* e_array
中,它可以是整数、字符或双精度值。
void v_push_back(vector_type v, void* new_val){
if ( v->no_e >= v->cur_cap ) {
/*** need to expand the array ***/
v->cur_cap += (v->cur_cap)? v->cur_cap : 2;
v->e_array = check_a(realloc(v->e_array, sizeof(void*) * v->cur_cap));
//allocate memory
}
/*** copy new_val into the array at end position (v->no_e) ***/
printf("%d %d %p\n",v->e_sz,v->no_e,v->e_array+(v->no_e *v->e_sz));
memcpy(
v->e_array +(v->no_e)*v->e_sz,
new_val,
v->e_sz
);
(v->no_e)++;
}
我是这样调用这个函数的:
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");
但它似乎不适用于整数但适用于字符但对于整数垃圾值被复制如下所示: enter image description here
请帮帮我。谢谢
这里是完整的项目: https://s3.amazonaws.com/assignment.pointers.vectorc.implementation/C-VectorImplementation1.zip
我看到的问题很少,
为了获得当前矢量类型的第 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)++; }