2015-05-06 19 views
8

Desidero scrivere una funzione che crei una copia di un array doppio utilizzando i puntatori. Questo è il mio codice finora:C - malloc - conversione non valida da void * a double *

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

Ho 2 errori di compilazione che non riesco a sbarazzarsi. Ottengo

conversione non valida dal void * di raddoppiare *

quando si tenta di allocare la memoria utilizzando malloc, ma non riesco a capire quello che sto facendo male.

+5

Sembra che tu stia utilizzando un compilatore C++ anziché C. – Barmar

+0

Come stai compilando? Sembra che tu stia usando un compilatore 'C++' –

+1

C consente di convertire i puntatori di 'void *' in/da qualsiasi altro tipo di puntatore. C++ richiede un cast esplicito. – Barmar

risposta

25

Si sta utilizzando un compilatore C++.

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

è valido in C. C'è una conversione implicita da qualsiasi tipo di puntatore oggetto void *.

in C++ non è valido, non esiste una conversione implicita, ed è necessario un cast:

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

utilizzando l'estensione di file __. Cpp__ in gcc causa anche l'errore 'invalid conversion from void * a double *' nello scenario sopra – hungryWolf

3

È la compilazione di codice C, con un compilatore C++.

Quando si utilizza un compilatore C++, si dovrebbe scrivere codice C++, in modo da malloc() non è così comune in C++, invece

double *data = new double[size]; 

sarebbe bene codice C++, se avete bisogno di free() il puntatore, è necessario

delete[] data; 

ovviamente si può utilizzare malloc() in C++, ma sarebbe come questo

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

perché void * in C++ non viene convertito automaticamente in alcun tipo di puntatore.

In c, tuttavia, non è necessario il cast, e in effetti rende il codice inutilmente brutto a parte nascondendo i bachi dal programma, cehck qui Do I cast the result of malloc?.

+0

possiamo 'static_cast' da e verso tipi di puntatori void in C++, almeno –

+0

@RedAlert non è' reinterpret_cast 'Esattamente equivalente ai cast di tipo C? –

+0

'reinterpret_cast' è una specializzazione del generico c-casting. Quando usi un cast in stile c, il compilatore sceglie quale tipo di cast usare. Ad esempio, non puoi dire 'reinterpret_cast (6)', ma puoi dire '(doppio) 6'. Inoltre, 'reinterpret_cast' non può eliminare la costanza, mentre un cast in stile c può (è necessario' const_cast' per questo in C++).Nel cast di 'void *', non c'è tecnicamente nulla da "reinterpretare", dal momento che un puntatore vuoto non rivela il tipo a cui punta. –

Problemi correlati