const static int VECTOR_BASIC_LENGTH = 20;
struct m_vector
{
void* my_vector;
size_t my_capacity;
size_t my_head;
};
typedef struct m_vector Vector;
Vector creat_Vector(size_t size,void *judge)
{
Vector _vector;
size = size?size:VECTOR_BASIC_LENGTH;
_vector.my_capacity = size;
_vector.my_head = 0;
//How I write the following two lines
_vector.my_vector = malloc(sizeof(*judge) * size);
return _vector;
}
判断的类型是不确定的,所以我将void指针作为参数传递。我需要*judge
的大小来将内存分配给_vector.my_vector
,例如,如果我使用:
int *a;
creat_Vector(5,a);
我想要以下一行:
_vector.my_vector = malloc(sizeof(*judge)*size);
等于:
_vector.my_vector = malloc(sizeof(*a)*5);
我怎样才能实现这个功能。使用纯C
答案 0 :(得分:2)
您的代码中有一个禁止的事情。
您静态地(在编译时)在函数_vector
中分配/声明类型为Vector
的本地creat_Vector
。然后将此对象返回到外部世界。但是,当您退出函数时,所有本地数据都已丢失。所以,你绝对应该重新考虑这一点。
一个建议是:
int init_Vector(Vector* _vect, size_t size, unsigned int ptr_size)
{
size = size?size:VECTOR_BASIC_LENGTH;
_vect->my_capacity = size;
_vect->my_head = 0;
_vect->my_vector = malloc(size*ptr_size);
if (_vect->my_vector) {
return 0;
}
return 1;
}
然后:
Vector _vector;
char *a;
if (init_Vector(&_vector, 5, sizeof(char)) == 0) {
printf("Success!\n");
}
else {
printf("Failure!\n");
/* treat appropriately (return error code/exit) */
}
/* do whatever with a (if needed) and _vector*/