Wo ist der Unterschied? malloc
-
Hallo wieder ich habe folgende Frage und zwar :
sei:
int *x
wo liegt der Unterschied wenn ich schreibe
x=(int*)malloc(sizeof(int));
und wo wenn ich schrebe
x=(int*)malloc(sizeof(x));Wie sollte man im allgemeinen bei der Speicherreservierung vorgehen??
Hat jemand ein guter Tip oder ein gutes Buch??Danke kilomat
-
x=(int*)malloc(sizeof(int));
...
x=(int*)malloc(sizeof(x));Das das untere schief gehen kann wenn die Größe eines Pointers nicht die dem eines Integers enspricht.
Ausser bei C++ Compilern ist übrigens der (int*) cast von malloc nicht notwendig.
Für gewöhnlich schreibt man es wie folgt
x = malloc(sizeof(*x));
bye
tt
-
Also für gewöhnlich schreibe ich es:
x = malloc(sizeof(int));
(Ansichtssache ;))
sizeof(x) ist in dem Fall, deswegen falsch, weil sizeof(x) dir nur die Größe eines Zeigers zurückliefert. Allerdings sagt das ja nichts darüber aus auf welchen Datentyp der Zeiger zeigt. Schief gehen kanns damit erst, wenn du mit dem Zeiger auf einen größeren Datentyp zeigst als die Größe eines Zeigers und du dann auch noch auf den nicht reservierten Speicher schreibst. (-> Bufferoverflow)
Hier im Forum findest du schon einige gute Beispiele, wie man mit dynamischer Speicherreservierung umgeht. Ein spezielles Buch dazu kenne ich leider nicht, möchte aber nicht ausschließen, dass es sowas auch gibt ;).
-
Was wäre wenn
float *x;Dann wäre
sizeof(float)>sizeof(x)
sizeof(float)==sizeof(*x)
-
chille07 schrieb:
Was wäre wenn
float *x;Dann wäre
sizeof(float)>sizeof(x)
sizeof(float)==sizeof(*x)Ja und nein.
Wenn das Programm 16Bit kompiliert ist, dann stimmt es, da ein int dort nur 2 Byte hat. Bei 32Bit sind es allerdings schon 4 Byte. Dann wäre also sizeof(float) == sizeof(x) (= sizeof(int)). Bei 64Bit wärs so sizeof(float) < sizeof(x).Was allerdings immer stimmt, ist: sizeof(float) == sizeof(*x)
-
Wenn ich mich nicht irre, ist ein Pointer immer 4 Byte groß.
Ich schreibe immerpPointer = (pointertyp) malloc (Anzahl*sizof(Datentyp));
mfg
Horst
-
Horst2 schrieb:
Wenn ich mich nicht irre, ist ein Pointer immer 4 Byte groß.
Ich schreibe immerpPointer = (pointertyp) malloc (Anzahl*sizof(Datentyp));
Warum castest du??
-
Horst2 schrieb:
Wenn ich mich nicht irre, ist ein Pointer immer 4 Byte groß.
Du irrst.
-
Ohne mich jetzt allzuweit aus dem Fenster lehnen zu wollen würde ich behaupten, dass ein Pointer immer so groß ist wie die vom OS genutzte Größe des Adressregisters. Sprich: Bei DOS 16 Bit, bei den 32-Bit-Win- und Linux-Versionen 32 Bit und bei den 64-Bit-Versionen halt 64 Bit.
-
Shade Of Mine schrieb:
Warum castest du??
Weil malloc einen void Zeiger zurück liefert.
void *malloc( size_t size );
-
Horst2 schrieb:
Shade Of Mine schrieb:
Warum castest du??
Weil malloc einen void Zeiger zurück liefert.
void *malloc( size_t size );
Und?
Warum castest du?Ein void Zeiger lässt sich ja bekanntlich in alle anderen Zeiger Typen implizit (also ohne cast) konvertieren...
-
Shade Of Mine schrieb:
Horst2 schrieb:
Shade Of Mine schrieb:
Warum castest du??
Weil malloc einen void Zeiger zurück liefert.
void *malloc( size_t size );
Und?
Warum castest du?Ein void Zeiger lässt sich ja bekanntlich in alle anderen Zeiger Typen implizit (also ohne cast) konvertieren...
Wennste nur klugscheißen kannst, hm?
Es gibt nun mal Compiler, bei denen man casten muss!
Blöder Klugscheisser...
-
tztztz schrieb:
Es gibt nun mal Compiler, bei denen man casten muss!
Jo, C++-Compiler. Guck mal wie das Forum heißt...
-
Bashar schrieb:
tztztz schrieb:
Es gibt nun mal Compiler, bei denen man casten muss!
Jo, C++-Compiler. Guck mal wie das Forum heißt...
Und? Schon mal drüber nachgedacht, dass es Leute gibt, die ANSI C mit einem C++ Compiler programmieren?
-
tztz schrieb:
Und? Schon mal drüber nachgedacht, dass es Leute gibt, die ANSI C mit einem C++ Compiler programmieren?
Warum sollte man soetwas machen? Abgesehen davon, dass es nicht geht - weil C++ nunmal C nicht zu 100% beinhaltet?
-
Shade Of Mine schrieb:
tztz schrieb:
Und? Schon mal drüber nachgedacht, dass es Leute gibt, die ANSI C mit einem C++ Compiler programmieren?
Warum sollte man soetwas machen?
Um die Vorteile der neuen IDEs nutzen zu können?
Abgesehen davon, dass es nicht geht
Ich mache es seit Monaten.
- weil C++ nunmal C nicht zu 100% beinhaltet
Bring doch mal bitte ein Beispiel, wo das beim programmieren wirklich ins Gewicht fallen würde.
-
tztz schrieb:
Um die Vorteile der neuen IDEs nutzen zu können?
Mhm, ich kenne keine reine C++ IDE - welche verwendest du?
Mir fällt nämlich echt kein Compiler ein, der nur C++ kann...Ich mache es seit Monaten.
*lol* Masochist.
Du lebst also gerne mit längeren Compilezeiten und verwirrterem ASM Code für 0 Vorteile?
- weil C++ nunmal C nicht zu 100% beinhaltet
Bring doch mal bitte ein Beispiel, wo das beim programmieren wirklich ins Gewicht fallen würde.
[/quote]
Du kannst keine C99 Features verwenden
Du musst also C89 verwenden, das führt zu folgenden Problemen:
Du musst Prototypen anlegen - dh du kannst nicht jede C Bibliothek verwenden
Du hast ein echtes const, welches sich anders als in C verhält, dito für static
Du kannst C++ Funktionen verwenden die dann logischerweise mit einem C Compiler später nicht mehr funktionieren
void foo() ist unterschiedlich
enum ist unterschiedlich
flexible array members gibt es in C++ nicht
function name mangling
unterschiede bei nested structs
One Definition Rulemehr fällt mir gerade nicht ein
aber das lustigste ist ja, dass du diese Probleme im tausch gegen längere Compilezeiten bekommst. auch ist der ASM code von C++ Compilern schwerer zu lesen
du hast also keine Vorteile und viele Nachteile.
-
Deadlef schrieb:
Ohne mich jetzt allzuweit aus dem Fenster lehnen zu wollen würde ich behaupten, dass ein Pointer immer so groß ist wie die vom OS genutzte Größe des Adressregisters. Sprich: Bei DOS 16 Bit, bei den 32-Bit-Win- und Linux-Versionen 32 Bit und bei den 64-Bit-Versionen halt 64 Bit.
Korrekt. Vielleicht sollte man noch ergänzend sagen, dass sich dein OS auf das Zielsystem bezieht. Du kannst z. B. auch in einem 32Bit-System etwas für ein 16Bit-System compilieren; der Zeiger ist in diesem Fall dann 2 Byte (= 16Bit) groß.
@Shade
Und man kann sich das casten von void pointern sparen
-
AJ schrieb:
@Shade
Und man kann sich das casten von void pointern sparenVielleicht könnte man hier jetzt noch der Vollständigkeit halber anmerken, dass C++-Compiler tatsächlich einen Fehler ausgeben, wenn man nicht explizit castet. Heisst also konkret: Wenn C programmiert wird die Datei auch tatsächlich .c benennen!
-
Und bei den Einstellungen auch den C-Compiler auswählen (wenn vorhanden und möglich)!