Wozu muß man einem Zeiger einen Typ zuweisen, sind Adressen nicht eh alle vom Typ int?



  • Wenn ich mit

    (void *) malloc (sizeof(char));
    

    Speicher reserviere, wozu soll ich dann dem Typenlosen Rückgabewert
    einen Typ zuweisen.
    z.B:

    (int *) malloc (sizeof(char));
    

    Sind die Adressen auf die ein Zeiger zeigt nicht sowieso grundsätzlich
    bei einem 32 Bit System 4 Byte und auf einem 64 Bit System 8 Byte groß?



  • Der Typ gibt an, als was die Daten auf die der Zeiger zeigt interpretiert werden.

    int* -> Der Zeiger zeigt auf int-Daten.
    double* -> Der Zeiger zeigt auf double-Daten.
    void* -> Der Zeiger zeigt auf Daten unbekannten Typs.

    Der Cast des Rückgabewertes von malloc() ist übrigens gänzlich überflüssig.

    Typdef schrieb:

    Sind die Adressen auf die ein Zeiger zeigt nicht sowieso grundsätzlich bei einem 32 Bit System 4 Byte und auf einem 64 Bit System 8 Byte groß?

    Die Zeiger zeigen ja nicht auf Adressen, sondern die Zeiger SIND Adressen. Die Zeiger selbst sind 4 oder 8 Byte groß, jedoch nicht zwanglsäufig die Daten auf die die Zeiger zeigen.



  • Typdef schrieb:

    wozu soll ich dann dem Typenlosen Rückgabewert
    einen Typ zuweisen.

    Wer sagt denn, dass du das sollst?



  • Typdef schrieb:

    Wenn ich mit ... Speicher reserviere, wozu soll ich dann dem Typenlosen Rückgabewert einen Typ zuweisen.
    z.B:

    (int *) malloc (sizeof(char));
    

    Sind die Adressen auf die ein Zeiger zeigt nicht sowieso grundsätzlich
    bei einem 32 Bit System 4 Byte und auf einem 64 Bit System 8 Byte groß?

    Sind sie nicht zwangsweise. malloc() liefert prinzipiell einen void* zurück und die Frage ist völlig irrelevant, wieviel Platz der selber braucht. Sichergestellt wird durch den Compiler immer, daß damit ggf. alle Typen adressiert werden können.
    Das ist sehr praktisch, denn die Typisierung brauchst Du für die Dereferenzierung, dann kann man mit Pointern auch rechnen:

    int n = 12;
    	int *pInt = NULL;
    	unsigned char *pChar;
    
    	pInt = malloc(sizeof(n) * 2);	// Platz für zwei Ints
    	if (pInt)
    	{
    		pChar = (unsigned char *)pInt;		// Dublette als Zeiger auf char
    		pInt[0] = n;	// als Array interpretiert
    		pInt[1] = n * n;	// hier braucht es die Typisierung wg. der Breite
    		printf("erster Int: %d\n", *(pInt++)); // Ah, Pointer kann man auch hochzählen!
    		printf("zweiter Int: %d\n", *pInt);	// Tatsächlich, es kommt pInt[1]
    		for (n = 0; n < (sizeof(n) * 2); n++) // Und jetzt nochmal Char- weise.
    			printf("Char[%d]: %d\n", n, *(pChar++));
    	}
    

    Alle Klarheiten beseitigt? 😃

    EDIT: Jaja, free(pInt) fehlt, darf sich jeder selber reinbasteln. 🙂



  • Ja, danke.

    Also nur um damit rechnen zu können.
    Dann ist alles klar.



  • Typdef schrieb:

    Also nur um damit rechnen zu können.

    Nicht nur, wie hier bereits erwähnt wurde.



  • Typdef schrieb:

    Also nur um damit rechnen zu können.

    Falsch (und ich seh auch nicht, dass das irgendwer behauptet hat). Um den Speicher NUTZEN zu können.


Anmelden zum Antworten