Frage

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

* Ich habe eine Struktur namens String

War es hilfreich?

Lösung

Sie dies nicht tun. void* wird implizit gegossen, was Sie brauchen in C. Siehe auch die C FAQ warum Sie möchten ausdrücklich würde vermeiden, in C @ Sinans Antwort malloc Rückkehr Casting zeigt weiter, warum diese inkonsistent gefolgt wurde.

Andere Tipps

Da malloc einen Zeiger zurückgibt ungültig zu erklären, das heißt, es ist einfach, ohne Rücksicht Brocken Zuweisung von Speicher in Bezug auf die Daten, die dort gespeichert werden. In C ++ Ihre Leere zurück * wird nicht implizit auf den Zeiger des Typs gegossen werden. In Ihrem Beispiel haben Sie nicht gegossen, was malloc zurückgekehrt ist. Malloc zurück einen void *, die zu einem char * implizit gegossen wurde, aber in der nächsten Zeile Sie ... ok, es braucht nicht viel Sinn mehr.

Dies ist eine der wenigen Fragen, die die Aussage macht „C ++ ist eine Obermenge von C“ nicht ganz richtig. In C kann ein void Zeiger implizit auf jede andere Art von Zeiger gegossen werden. Allerdings ist C ++ ein bisschen strenger mit Typ-Sicherheit, so dass Sie explizit den Rückgabewert von malloc in dem entsprechenden Typ müssen werfen. Normalerweise ist dies nicht viel von einem Problem, weil C ++ Code new zu verwenden, neigt eher als malloc, die nicht eine Schublade gesteckt erfordert.

In C, das Ergebnis von malloc Gießen ist unnötig und sollte nicht durchgeführt werden. Dabei kann beispielsweise deckt die Fehler gescheitert zu #include <stdlib.h>, so dass Sie nicht einen Prototyp für malloc in Umfang haben. Dies wiederum kann zu anderen Fehlern und mangelnde Portabilität führen (obwohl die schlimmsten Übeltäter in dieser Hinsicht sind heute meist nicht mehr verwendet).

In C ++ müssen Sie das Ergebnis von malloc werfen es einen anderen Typen als nichtig zu einem Zeiger zuweisen. Es sei denn, Sie wirklich Notwendigkeit Code zu schreiben, entweder als C oder C ++ kompiliert werden kann, sollten Sie jedoch im Allgemeinen mit malloc in C ++ vermeiden überhaupt und weist Speicher mit new.

Sie neigen dazu, diese Art von C-Code aus Novizen zu sehen (oder C ++ Programmierern :-)):

int main() {
    int len = 40;
    char *my_string = (char *) malloc(sizeof(char)*len);
    return 0;
}

Dies ist unnötig und Böse, können Sie den nutzlosen Guss über einschließlich stdlib.h vermeiden

#include <stdlib.h>
int main() {
    int len = 40;
    char *my_string = malloc(sizeof(char)*len);
    return 0;
}

Sie sollten stark Gießen betrachten nach dem malloc Befehl verwenden, da es für eine größere Mobilität und eine bessere Kompatibilität mit anderen Teilen des Programms. Wenn Sie dies nicht tun, können Sie das Risiko von inkompatiblen Datentypen ausführen, die zu Fehlern führen könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top