it-swarm.com.de

malloc (sizeof (int)) gegen malloc (sizeof (int *)) gegen (int *) malloc (sizeof (int))

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))
21
sabergeek

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 int * Umwandeln sollten. (Ein Zeiger auf ein int.) Wie einige angemerkt haben, besteht die typische Praxis in C darin, implizites Casting dies erledigen zu lassen.

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.

42
Steven Burnap

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...
6
wildplasser