2015-05-06 2 views
8

Я хочу написать функцию, которая создает копию двойного массива с помощью указателей. Это мой код до сих пор:C - malloc - неверное преобразование из void * в 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); 
} 

У меня есть 2 ошибки компиляции, которые я не могу избавиться. Я получаю

недопустимое преобразование из пустоты * двойной *

при попытке выделить память с помощью таНос, но я не могу понять, что я делаю неправильно.

+5

Похоже, вы используете компилятор C++ вместо C. – Barmar

+0

Как вы компилируете? Похоже, что вы можете использовать компилятор 'C++' –

+1

C позволяет конвертировать указатели 'void *' в/из любого другого типа указателя. C++ требует явного приведения. – Barmar

ответ

25

Вы используете компилятор C++.

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

действует в С. Существует неявное преобразование из любого типа указателя объекта в void *.

В C++ это не действует, там нет такого неявного преобразования, и вы нуждаетесь в ролях:

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

с использованием расширения файла __. Cpp__ в gcc также вызывает 'недопустимое преобразование из void * в double *' ошибка в вышеприведенном сценарии – hungryWolf

3

Вы компилируете код на С, с C++ компилятор.

Когда вы используете компилятор C++, вы должны написать C++ код, поэтому malloc() не так часто в C++, вместо

double *data = new double[size]; 

будет хорошо с ++ код, если вам нужно free() указатель, вы нужно

delete[] data; 

Вы можете, конечно, использовать malloc() в C++, но это было бы, как это

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

потому что void * в C++ не преобразовывается в любой тип указателя автоматически.

В c, однако, нет необходимости в литье, и на самом деле это делает код излишне уродливым, кроме скрытия ошибок из вашей программы, cehck здесь Do I cast the result of malloc?.

+0

мы можем 'static_cast' из и из типов указателей void в C++, по крайней мере –

+0

@RedAlert не' reinterpret_cast 'в точности эквивалентно спускам типа c? –

+0

'reinterpret_cast' - это специализация самого общего c-casting. Когда вы используете c-style cast, компилятор выбирает, какой тип приведения используется. Например, вы не можете сказать 'reinterpret_cast (6)', но вы можете сказать '(double) 6'. Кроме того, 'reinterpret_cast' не может отбросить константу, в то время как c-style cast может (вам нужно' const_cast' для этого в C++).В листе 'void *' технически ничего не нужно «переинтерпретировать», поскольку указатель void не показывает, к какому типу он указывает. –

Смежные вопросы