malloc - invalid conversion de void* double*
Je veux écrire une fonction qui crée une copie d'un double tableau à l'aide de pointeurs.
C'est mon code pour l'instant:
#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 que je ne peux pas me débarrasser de. Je reçois
invalid conversion de void* double*
lorsque j'essaie d'allouer de la mémoire avec malloc, mais je ne peux pas comprendre ce que je fais mal.
- On dirait que vous êtes en utilisant un compilateur C++ au lieu de C.
- Comment êtes-vous de la compilation? Il semble que vous utilisez peut-être un
c++
compilateur - C permet
void*
pointeurs être converties ou de tout autre type de pointeur. C++ nécessite un cast explicite. - Mais si vous êtes à l'aide de C++, vous devez soit utiliser
std::vector
ounew double[size]
. - Remplacez le suffixe de votre fichier source .rpc .c et puis le compiler en C plutôt qu'en C++.
Vous devez vous connecter pour publier un commentaire.
Vous utilisez un compilateur C++.
est valide en C. Il y a une conversion implicite de n'importe quel objet de type pointeur de
void *
.En C++, il n'est pas valide, il n'existe pas de conversion implicite, et vous avez besoin d'un plâtre:
invalid conversion from void* to double*
erreur dans le scénario ci-dessusVous compiler le 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++, au lieuserait bon de code c++, si vous avez besoin de
free()
le pointeur, vous devezVous pouvez bien sûr utiliser
malloc()
en c++, mais ce serait comme çaparce que
void *
en c++ n'est pas convertie à tout type pointeur automatiquement.En c, cependant, il n'est pas nécessaire pour le casting, et en fait, elle rend le code inutilement laid en dehors de cacher les bugs de votre programme, cehck ici Dois-je cast le résultat de la fonction malloc?.
static_cast
et de vide de type pointeur en c++, au moinsreinterpret_cast
exactement équivalent à c type de jette?reinterpret_cast
est une spécialisation de la très générique c-casting. Lorsque vous utilisez un style c cast, le compilateur choisit quel type de fonte à utiliser. Par exemple, vous ne pouvez pas direreinterpret_cast<double>(6)
, mais vous pouvez dire(double) 6
. En outre,reinterpret_cast
ne peut pas lancer de loin constness, tandis qu'un style c cast pouvez (vous devezconst_cast
pour cela en c++). Dans le casting devoid*
, il n'y a techniquement rien à "réinterpréter", depuis un vide pointeur de ne pas révéler le type de pointe.