Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

malloc - invalid conversion from void* to double*

Tags:

c

malloc

I want to write a function that creates a copy of a double array using pointers. This is my code so far:

#include <stdio.h>
#include <stdlib.h>

double* copy (double *array, int size)
{
    double *v=malloc(sizeof(double)*size);
    for (int i=0; i<size; i++)
        *(v+i)=*(array+i);
    return v;
}

int main ()
{
    //double array[];
    int size;
    printf ("size= "); scanf ("%i",&size);
    double *array=malloc(sizeof(double)*size);
    for (int i=0; i<size; i++)
        scanf("%f",&array[i]);
    copy(array,size);
    free(array);
}

I have 2 compilation errors that I can't get rid of. I get

invalid conversion from void* to double*

when I try to allocate memory using malloc but I can't understand what I'm doing wrong.

like image 355
Diana Avatar asked May 06 '15 21:05

Diana


2 Answers

You are using a C++ compiler.

double *array=malloc(sizeof(double)*size);

is valid in C. There is an implicit conversion from any object pointer type to void *.

In C++ it is not valid, there is no such implicit conversion, and you need a cast:

double *array= (double *) malloc(sizeof(double)*size);
like image 155
ouah Avatar answered Sep 21 '22 11:09

ouah


You are compiling c code, with a c++ compiler.

When you are using a c++ compiler, you should write c++ code, so malloc() is not so common in c++, instead

double *data = new double[size];

would be good c++ code, if you need to free() the pointer, you need to

delete[] data;

You can of course use malloc() in c++, but it would be like this

double *data = static_cast<double *>(malloc(size * sizeof(double));

because void * in c++ is not converted to any pointer type automatically.

In c, however, there is no need for the cast, and in fact it makes the code unnecessarily ugly apart from hiding bugs from your program, cehck here Do I cast the result of malloc?.

like image 45
Iharob Al Asimi Avatar answered Sep 19 '22 11:09

Iharob Al Asimi