Das hat mit dem Geltungsbereich (Scope) von Parametern zu tun.
Es gibt bei Deinem Beispiel die Besonderheit, dass der Name der
Variablen im globalen Geltungsbereich gleich dem Namen im
Geltungsbereich der Funktion ist. Das hat hier aber keinerlei Bedeutung.
Zur Klarheit hier eine für Dein Problem äquivalente Variable und
Funktion:
1 | int * a = NULL; // Der Standardwert für Zeiger die auf nichts zeigen (nicht 0!=
|
2 |
|
3 | void function (int * b) {
|
4 | b = malloc (sizeof(int));
|
5 | }
|
6 |
|
7 | ...
|
8 |
|
9 | function (a);
|
Auch wenn die Funktion gleich aussieht, tritt hier das selbe Problem
auf, das wie folgt formuliert werden kann:
Alle Werte innerhalb einer Funktion haben nur Geltung innerhalb der
Funktion.
Du würdest ja (vermutlich) auch nicht erwarten, das folgender Code
1 | int a = 0;
|
2 |
|
3 | void function (int b) {
|
4 | b = 7;
|
5 | }
|
6 |
|
7 | function (a);
|
den Wert von a in der Weise verändert, dass nach dem Ende der Funktion
immer noch a = 7 gilt.
Analoges gilt auch für Zeiger.
Ein Zeiger ist an sich nur ein Wert, für den die Regeln des
Geltungsbereichs genauso gelten, wie für andere Variablen. Das der
Zeiger auf eine Speicherstelle zeigt ist an sich erstmal nichts
besonderes.
Zwar wird in der Funktion oben ein Speicher für b alloziiert, aber das
wirkt sich nicht auf a aus, obwohl es als Parameter übergeben wurde.
Um einen Zeiger, der innerhalb einer Funktion alloziiert werden soll, im
Geltungsbereich der aufrufenden Funktion (z.B. main) zugreifen zu
können, muss der Funktion eine Zeiger, auf einen Zeiger übergeben
werden, nicht nur ein Zeiger.
1 | int * a = NULL;
|
2 |
|
3 | void function (int * * b) {
|
4 | *b = malloc(sizeof(int));
|
5 | }
|
6 |
|
7 | function (& a);
|
In neuerem C gibt es dazu noch einen anderen Operator. Aber dazu guckst
Du vielleicht erstmal in einem C-Buch nach Zeigern auf Zeiger; und dann
nach "Referenzen".