web-dev-qa-db-fra.com

malloc - conversion invalide de void * en double *

Je veux écrire une fonction qui crée une copie d'un double tableau à l'aide de pointeurs. Voici mon code jusqu'à présent:

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

J'ai 2 erreurs de compilation dont je ne peux pas me débarrasser. Je reçois

conversion invalide de void * en double *

lorsque j'essaie d'allouer de la mémoire à l'aide de malloc, mais je ne comprends pas ce que je fais mal.

18
Diana

Vous utilisez un compilateur C++.

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

est valide en C. Il existe une conversion implicite de tout type de pointeur d'objet en void *.

En C++, il n'est pas valide, il n'y a pas de conversion implicite de ce type et vous avez besoin d'un cast:

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

Vous compilez du code c, avec un compilateur c ++.

Lorsque vous utilisez un compilateur c ++, vous devez écrire du code c ++, donc malloc() n'est pas si courant en c ++, à la place

double *data = new double[size];

serait un bon code c ++, si vous avez besoin de free() le pointeur, vous devez

delete[] data;

Vous pouvez bien sûr utiliser malloc() en c ++, mais ce serait comme ça

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

car void * en c ++ n'est pas automatiquement converti en n'importe quel type de pointeur.

En c, cependant, il n'y a pas besoin de cast, et en fait cela rend le code inutilement laid en plus de cacher les bugs de votre programme, cehck ici Est-ce que je cast le résultat de malloc? .

6
Iharob Al Asimi