我怎么知道不确定类型参数的大小

时间:2015-06-17 11:01:31

标签: c

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

1 个答案:

答案 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*/