From: Josef Moellers <mollers.pad@sni.de>
Subject: Re: Verhalten von struct-Pointers
Date: Thu, 13 Aug 1992 06:11:51 GMT
Organization: Siemens Nixdorf Info.Sys. AG, Paderborn, Germany

In <16blbiINNjd7@fbi-news.Informatik.Uni-Dortmund.DE> maennig@anton.informatik.uni-dortmund.de (Olaf Maennig) writes:

>Hallo,
>ich weiss, dass das jetzt wieder 'ne dumme Frage ist, aber ich verstehe
>nicht, wie der Compiler struct-Pointer behandelt (oder Pointer allgemein?)
>Und zwar nehme man folgendes Progr"ammchen:

>#include <malloc.h>

>typedef struct test
>{
>    int   integer;
>    char  character;
>} TEST;


>void change1(TEST *s)
>{
>    s->integer   = 999;
>    s->character = 'c';
>}


>void change2(TEST *s)
>{
>    s->integer   = 17;
>    s->character = 'a';
>}


>void freestruct(TEST **s)
>{
>    free(*s);
>    *s = 0x0;
>}


>void main(void)
>{
>    TEST *structure;

>    structure = (TEST*) calloc(1, sizeof(TEST*));

>    change1(structure);
>    change2(structure);
>    freestruct(&structure);
>}


>structure-Werte k"onnen durch Angabe eines Pointers auf structure ge"andert
>werden, warum aber wird structure auf NULL gesetzt, wenn freestruct() so
>aussieht:

>void freestruct(TEST *s)
>{
>    free(s);
>    s = 0x0;
>}

>und der Aufruf freestruct(structure) lautet?
>Wird der Speicherplatz f"ur structure im zweiten Fall "uberhaupt freigegeben?

Also, alles der Reihe nach:

Fall A
------
Wenn Du "freestruct(&structure)" aufrufst (mit der entsprechenden
Definition von "freestruct(TEST **s)"), so wird die _Adresse_ der
Variablen "structure" an die Prozedur "freestruct" uebergeben.
Diese nutzt die Adresse, um
1.) von dort die Adresse der allokierten TEST-Struktur zu holen, um den
    Speicher wieder freizugeben _und_
2.) dort einen Wert "0" abzulegen.

Grafisch:
		main:			freestruct:
		    +-----------+
		    |		|
		    v		|
		+-------+	|	+-------+
     structure: |   *	|	|    s: |   *	|
		+---+---+	|	+---+---+
		    |		|	    |
		    |		+-----------+
		    v
		+-------+
		|	|
		~	~  <- mit "calloc" allokierter Speicher
		|	|
		+-------+
Fall B
------
Wenn Du aber "freestruct(structure)" aufrufst (nun mit der anderen
Definition: "freestruct(TEST *s)"), so wird der _Inhalt_ der Variablen
"structure" an die Prozedur "freestruct" uebergeben und (im
wesentlichen) in einer fuer "freestruct" lokalen Variable abgelegt.
Diese lokale Variable kann ein Register oder eine Speicherstelle (z.B.
auf dem Stack) sein. "freestruct" holt sich jetzt aus dieser Variablen
die Adresse der allokierten TEST-Struktur, gibt diese frei und setzt
_die lokale Variable_ auf den Wert "0". Da dies aber nur eine Kopie von
"structure" war, bleibt "structure" unveraendert. Wenn dem nicht so ist,
dann hat Dein C-Compiler leider 'ne Macke B-{)


Grafisch:
		main:			freestruct:
		+-------+		+-------+
     structure: |   *	|	     s: |   *	|
		+---+---+		+---+---+
		    |			    |
		    |+----------------------+
		    ||
		    vv
		+-------+
		|	|
		~	~  <- mit "calloc" allokierter Speicher
		|	|
		+-------+

BEDENKE: C kennt _nur_ "value"-Parameter.

Hope this helps,

Josef
-- 
| Josef Moellers		| c/o Siemens Nixdorf Informationssysteme AG  |
|  USA: mollers.pad@sni-usa.com	| Abt. STO-XS 113	   | Riemekestrasse   |
| !USA: mollers.pad@sni.de	| Phone: (+49) 5251 835124 | D-4790 Paderborn |