malloc – ungültige Umwandlung von void* in double*

Lesezeit: 3 Minuten

Benutzer-Avatar
Diana

Ich möchte eine Funktion schreiben, die mithilfe von Zeigern eine Kopie eines doppelten Arrays erstellt. Das ist mein Code bisher:

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

Ich habe 2 Kompilierungsfehler, die ich nicht loswerden kann. Ich bekomme

ungültige Konvertierung von void* zu double*

wenn ich versuche, Speicher mit malloc zuzuweisen, aber ich kann nicht verstehen, was ich falsch mache.

  • Klingt so, als würden Sie einen C++-Compiler anstelle von C verwenden.

    – Barmar

    6. Mai 2015 um 21:37 Uhr

  • Wie kompilierst du? Es hört sich so an, als würden Sie möglicherweise eine verwenden c++ Compiler

    – Roter Alarm

    6. Mai 2015 um 21:38 Uhr

  • C erlaubt void* Zeiger, die in/von jedem anderen Zeigertyp konvertiert werden sollen. C++ erfordert eine explizite Umwandlung.

    – Barmar

    6. Mai 2015 um 21:38 Uhr

  • Aber wenn Sie C++ verwenden, sollten Sie entweder verwenden std::vector oder new double[size].

    – Barmar

    6. Mai 2015 um 21:39 Uhr

  • Ändern Sie das Suffix Ihrer Quelldatei von .cpp in .c und kompilieren Sie sie dann als C und nicht als C++.

    – PaulR

    6. Mai 2015 um 21:51 Uhr

Sie verwenden einen C++-Compiler.

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

ist in C gültig. Es gibt eine implizite Konvertierung von jedem Objektzeigertyp zu void *.

In C++ ist es nicht gültig, es gibt keine solche implizite Konvertierung, und Sie benötigen eine Umwandlung:

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

  • verwenden .cpp Dateierweiterung in gcc verursacht auch invalid conversion from void* to double* Fehler im obigen Szenario

    – hungriger Wolf

    20. September 2017 um 5:05 Uhr


Benutzer-Avatar
Iharob Al-Asimi

Sie kompilieren C-Code mit einem C++-Compiler.

Wenn Sie einen C++-Compiler verwenden, sollten Sie C++-Code schreiben, also malloc() ist in C++ nicht so üblich

double *data = new double[size];

wäre guter C++-Code, wenn Sie müssen free() der Zeiger, müssen Sie

delete[] data;

Kannst du natürlich verwenden malloc() in c++, aber es wäre so

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

Weil void * in c++ wird nicht automatisch in einen Zeigertyp konvertiert.

In c besteht jedoch keine Notwendigkeit für die Umwandlung, und tatsächlich macht es den Code unnötig hässlich, abgesehen davon, dass Fehler aus Ihrem Programm versteckt werden, siehe hier. Kann ich das Ergebnis von malloc? umwandeln.

  • wir können static_cast zu und von void-Zeigertypen zumindest in c++

    – Roter Alarm

    6. Mai 2015 um 21:46 Uhr

  • @RedAlert ist es nicht reinterpret_cast genau äquivalent zu Typ-C-Casts?

    – Iharob Al Asimi

    6. Mai 2015 um 22:00 Uhr

  • reinterpret_cast ist eine Spezialisierung des sehr generischen C-Castings. Wenn Sie eine Umwandlung im C-Stil verwenden, wählt der Compiler aus, welche Art von Umwandlung verwendet werden soll. Das kann man zum Beispiel nicht sagen reinterpret_cast<double>(6)aber man kann sagen (double) 6. Außerdem, reinterpret_cast Konstanz kann nicht weggeworfen werden, während eine Besetzung im C-Stil dies kann (Sie benötigen const_cast dafür in c++). In der Besetzung von void*gibt es technisch gesehen nichts zu “reinterpretieren”, da ein void-Zeiger nicht verrät, auf welchen Typ er zeigt.

    – Roter Alarm

    6. Mai 2015 um 22:24 Uhr


1310650cookie-checkmalloc – ungültige Umwandlung von void* in double*

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy