Pointer als Parameter an Funktion

Hallo zusammen!

Ich bin (noch) nicht besonders erfahren in C.
Beim Programmieren eines Sockets auf Client-Seite bin ich auf ein kleines Verständnisproblem gestoßen. Falls mir das jemand erklären könnte, wäre ich sehr erfreut!

Hier mein kleiner Code-Ausschnitt. Es wird eine Verbindung mit einem Server aufgebaut.


struct sockaddr_in addr;

addr.sin_family = AF_INET;
addr.sin_port = htons(port); // port
addr.sin_addr.s_addr=inet_addr(server); // server

connect( socketCon, (struct sockaddr *)&addr, sizeof(addr) )

Die Datenstruktur addr sei lokal und die Variable socketCon sei global definiert, damit vom ganzen Programm aus auf socketCon zugegriffen werden kann.
Ich übergebe also der Funktion connect einen Pointer auf die Datenstruktur addr, wo u. a. Port (sin_port) und Server-Adresse (s_addr) abgelegt sind.
Für mich als Benutzer von connect geht jetzt aber nicht hervor wie die Funktion mit diesen Variablen umgeht. Wird intern ein Pointer auf die Variablen sin_port und s_addr gelegt oder werden die Inhalte in neue Variablen kopiert? Falls darauf mit einem Pointer verweisen wird, dann gehen ja die Variblen verloren sobald meine Funktion, in der connect aufgerufen wird, beendet ist.
Deshalb gehe ich mal davon aus, dass die Werte kopiert werden.

Das bringt mich gleich zu einer allgemeineren Frage: Wie kann ich als Benutzer einer Funktion, die einen Pointer übergeben bekommt herausfinden, ob auf meine „gezeigte“ Variable funktionsintern ein Pointer gesetzt wird, der auch nach Beendigung der Funktion noch darauf zeigt und später verwendet wird?

Falls mir das jemand erklären könnte wäre ich sehr dankbar!

Danke & Grüße,
Mac

Hi,
eigentlich sollte diese Frage in der Funktionsdeklaration beantwortet werden:
z.B. f(const char* c) bedeutet, dass das c, das du übergibst, nicht verändert werden kann.
f(restrict char* c) (restrict wurde glaube ich mit C99 eingeführt) verhindert genau das. Das Schlüsselwort erzwingt, dass die „gezeigte“ Variable nur von genau einem Zeiger referenziert wird.
Wenn keines der Schlüsselwörter angegeben ist, kannst du nicht sicher sein, ob der Zeiger kopiert oder verändert wird.
Die einzige mir bekannte Möglichkeit, dieses Problem zu übergehen, ist, auf C++0x zu warten (Stichwort: TR1::smart_ptr). Du kannst natürlich auch die Boost-Implementierung (Boost::TR1) verwenden. Wenn du aber nur C verwenden kannst, funktioniert das leider nicht.

mfg, Hans