Ich erkenne an, dass alle drei eine unterschiedliche Bedeutung haben. Aber ich verstehe nicht, auf welche besonderen Fälle diese jeweils zutreffen würden. Kann jemand ein Beispiel für jede dieser teilen? Vielen Dank.
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
malloc(sizeof(int))
bedeutet, dass Sie außerhalb des Heapspeichers Speicherplatz zum Speichern eines int
zuweisen. Sie reservieren so viele Bytes, wie ein int
benötigt. Dies gibt einen Wert zurück, den Sie in Wie einige angemerkt haben, besteht die typische Praxis in C darin, implizites Casting dies erledigen zu lassen.int *
Umwandeln sollten. (Ein Zeiger auf ein int
.)
malloc(sizeof(int*))
bedeutet, dass Sie außerhalb des Heapspeichers Speicherplatz zuweisen, um einen Zeiger auf ein int
zu speichern. Sie reservieren so viele Bytes, wie ein Zeiger benötigt. Dies gibt einen Wert zurück, den Sie in int **
Umwandeln sollten. (Ein Zeiger auf einen Zeiger auf ein int
.)
(int *)malloc(sizeof(int))
Ist genau das Gleiche wie der erste Aufruf, jedoch wird das Ergebnis explizit auf einen Zeiger auf ein int
umgewandelt.
Beachten Sie, dass auf vielen Architekturen ein int
die gleiche Größe wie ein Zeiger hat, sodass dies (fälschlicherweise) dasselbe zu sein scheint. Mit anderen Worten, Sie können versehentlich das Falsche tun und der resultierende Code funktioniert immer noch.
Das am besten geeignete Syntaxmuster ist:
int *p;
p = malloc (cnt * sizeof *p);
Diese Syntax zwingt Sie nicht, den Code zu ändern, wenn sich der Typ (und/oder die Größe ...) von * p ändert, z. B. in
struct mysstruct *q;
q = malloc (cnt * sizeof *q);
Welches vermeidet Probleme wie
struct mysstruct *z;
z = malloc (cnt * sizeof(struct hisstruct)); // Auch!
, plus: Das Formular sizeof expr
ist auch kürzer.
UPDATE: um die Korrektheit von p = malloc(CNT * sizeof *p)
dieses Testprogramms zu demonstrieren:
#include <stdio.h>
#include <stdlib.h>
struct mystruct {
int i;
char s[14];
};
int main(void)
{
struct mystruct *p;
size_t siz;
siz = sizeof p;
printf("Sizeof p := %zu\n", siz);
siz = sizeof *p;
printf("Sizeof *p := %zu\n", siz);
printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n"
, 10u * sizeof *p
, 10u, sizeof *p
);
p = malloc(10 * sizeof *p);
return 0;
}
Welche Ausgänge hier:
Sizeof p := 8
Sizeof *p := 20
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...