icecity96
icecity96

Reputation: 1227

How could I know an Uncertain type parameters' size

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;
}

The type of judge is uncertain,so I pass a void pointer as a parameters.I need the size of *judge to allocate memory to _vector.my_vector,for example if I use:

int *a;
creat_Vector(5,a);

I want the following line:

_vector.my_vector = malloc(sizeof(*judge)*size);

is equal to:

_vector.my_vector = malloc(sizeof(*a)*5);

How could I achieve this function.Using pure C

Upvotes: 0

Views: 43

Answers (1)

Eugeniu Rosca
Eugeniu Rosca

Reputation: 5305

There is a forbidden thing done in your code. You statically (at compile time) allocate/declare a local _vector of type Vector in your function creat_Vector. Then you return this object to the outside world. However, when you are exiting your function, all local data is dead. So, you should absolutely rethink this.

One suggestion would be:

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;
}

Then:

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

Upvotes: 2

Related Questions