2015-05-06 8 views
8

Chcę napisać funkcję, która tworzy kopię podwójnej tablicy za pomocą wskaźników. To jest mój kod do tej pory:C - malloc - nieprawidłowa konwersja z void * na podwójne *

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

mam 2 błędy kompilacji, że nie mogę się pozbyć. Mam

nieprawidłową przemianę z void * podwoić *

podczas próby przydzielić pamięci za pomocą malloc, ale nie mogę zrozumieć, co robię źle.

+5

Wygląda na to, że używasz kompilatora C++ zamiast C. – Barmar

+0

Jak się kompilujesz? Wygląda na to, że używasz kompilatora 'C++' –

+1

C, który pozwala na przekonwertowanie 'void *' na/z dowolnego innego typu wskaźnika. C++ wymaga jawnej obsady. – Barmar

Odpowiedz

25

Używasz kompilatora C++.

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

jest ważna w C. Jest niejawna konwersja z dowolnego typu obiektu wskaźnik do void *.

w C++ nie jest ważne, nie ma takiego niejawna konwersja, i trzeba Obsada:

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

przy użyciu __. Rozszerzenie pliku cpp__ w gcc powoduje także 'nieprawidłową konwersję z void * na podwójny *' błąd w powyższym scenariuszu – hungryWolf

3

kompilujesz kod C z kompilatora C++.

Kiedy używasz kompilatora C++, trzeba napisać kod C++, więc malloc() nie jest tak powszechne w C++, zamiast

double *data = new double[size]; 

byłoby dobre C++ kod, jeśli trzeba free() wskaźnik, ty trzeba

delete[] data; 

można oczywiście użyć malloc() w C++, ale byłoby tak

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

ponieważ void * w języku C++ nie jest automatycznie konwertowane na dowolny typ wskaźnika.

W c, jednak nie ma potrzeby, aby obsada, a w rzeczywistości sprawia, że ​​kod niepotrzebnie brzydki oprócz ukrywania błędów z programu, cehck tutaj Do I cast the result of malloc?.

+0

możemy 'static_cast' na i od typów pustych wskaźników w C++, co najmniej –

+0

@RedAlert nie jest' reinterpret_cast "dokładnie odpowiada rzutom typu c? –

+0

'reinterpret_cast' jest specjalizacją bardzo typowego c-castingu. Podczas używania rzutowania w stylu c kompilator wybiera rodzaj rzutowania do użycia. Na przykład, nie możesz powiedzieć 'reinterpret_cast (6)', ale możesz powiedzieć '(double) 6'. Co więcej, 'reinterpret_cast' nie może odrzucić constness, podczas gdy cast w stylu c może (potrzebujesz' const_cast' dla tego w C++).W obsadzie 'void *' technicznie nie ma nic do "reinterpretacji", ponieważ pusty wskaźnik nie pokazuje, do jakiego typu wskazuje. –