C Pointer Lebensdauer

matt_sille

Grünschnabel
Hallo

Ich hätte mal eine Frage wegen der Lebensdauer von Pointer.

Wenn ich nun eine Datei programmA.c habe und eine Funktion von programmB.c aufrufe, dann kann ich ja Pointer übergeben.

Der Code könnte dann zb. so aussehen:
programmA.c :
....
functionB(*filepointer, ... );
....

programmB.c:

functionB(*fp,....){

fp = fopen("bla.txt"... );
}

Kann dann der Pointer filepointer nach Beenden der Funktion (functionB) immer noch auf die Adresse zeigen, oder verliert er dann seinen Wert?

Danke im Voraus.
 
Im Pointer selbst wird nur eine Adresse gespeichert. So lange der Speicher für den Pointer reserviert ist, so lange ist auch die Gültigkeit seines Inhalts garantiert. Kurz heißt das: Ja, nach dem Verlassen von funktionB zeigt der Zeiger in funktionA auf die in funktionB von fopen zurückgegebene Speicheradresse.
 
Danke für die Info

Ich habe es auch ausprobiert, nur hat es leider nicht funktioniert, der Pointer verliert leider seinen Wert.
 
Wie kommst du darauf? Ein Pointer ist entweder nicht initialisiert, oder zeigt auf eine Speicheradresse (welche nicht zwangsweise gültig oder zugriffsberechtigt sein muss). Aber nie wird sich der Zustand ohne weiteres Zutun ändern (Mal abgesehen von Rechnerinternen Problemen oder einer fehlerbehafteten Compilierung).

Die Übergabe des Pointeres in funktionA sollte übrigens ohne das Asterisk vor dem Pointernamen stattfinden, denn sonst übergibst du den Inhalt unter der in filepointer gespeicherten Adresse als "Adresse", und nicht die Adresse selbst.
 
Hallo

Danke für eure Antworten. Ich hab das jetzt ein bisschen anders gelöst, aber sollte auch so funktionieren. Nur ist es so, das ich die Adresse des Pointers weitergeben möchte, weil ich möchte rekursiv die funktion strtok verwenden.

Hier der Code:
Code:
int stringCompare(char *strA, char *strB, int lineCount){
	if((strA ==NULL) || (strB == NULL)){
		return 0;
	}
		if ((strcmp (strA, strB)) == 0){
			/* equal */
		}else{
			if((strcmp (strA, strB)) > 0){
				/* a is longer*/
			}else{
				/* b is longer*/			
			}
		}
	
	return stringCompare((strtok(NULL, "\n")), (strtok(NULL, "\n")), ++lineCount);
} 
/*....*/
stringCompare((strtok(sideA, "\n")), (strtok(sideB, "\n")), lcount);
lcount ist initialisiert auf 1, und sideA und sideB zeigen jeweils auf inhalte.
Kann es sein das ich hier in dem Fall nur den Wert weitergebe und nicht die Adresse?

Danke im Voraus.
 
Hi.

Die Funktion strtok kannst du nicht auf mehrere Strings gleichzeitig anwenden, sondern nur auf einen einzelnen String. Um mit mehreren Strings gleichzeitig zu arbeiten müßtest du strtok_r verwenden.

Evtl. solltest du mal etwas weiter ausholen und erklären was du überhaupt implementieren willst.

Dein ursprüngliches Problem betreffend: Du änderst lediglich den Wert des Parameters der Funktion, d.h. die Kopie einer Zeigeradresse. In dem aufrufenden Programmteil ändert sich gar nichts. Du müßtest die Adresse eines Zeigers übergeben.

Gruß
 
jo stimmt schon, na jedenfalls ists gefährlich weils ja den original string zerhackt, aber wenns gewünscht ist ists natürlich ok.
Dachte es soll evt nur verglichen werden.
 
Zurück