Volker Kroll [18 Jul 2002 14:24:56 +0200]:
Wenn ich einer Funktion einen Pointer übergebe, sollte diese doch den
Inhalt des Pointers ändern können.
Den Inhalt ja, nicht aber den Zeiger selbst.
#include
void t1(int *i1)
{
*i1 = 100;
}
int main (int argc, char* argv[])
{
int i = 500;
printf("Vor Aufruf von t1(): %d\n", i);
t1(&i);
printf("Nach Aufruf von t1(): %d\n", i);
return 0;
}
Warum funktioniert dann diese
Funktion nicht:
#include
void tester(char*);
int main (int argc, char* argv[])
{
char *field = "teststring";
tester(field);
printf("String: %s\n", field);
/* prints teststring not langer String */
return 0;
}
void tester(char* test) {
test = "langer String";
}
tester bekommt einen Zeiger übergeben, also eine Adresse übergeben.
Die kannst du ändern solang du willst, änderst damit aber nicht den
Zeiger in main. So müsste es ungefähr aussehen, damit es funktioniert:
#include
#include
void tester(char **t)
{
*t = "langer string";
}
int main (int argc, char* argv[])
{
char *field = "teststring";
tester(&field);
printf("String: %s\n", field);
return 0;
}
Aber Vorsicht, das geht nur mit Stringkonstanten gut! Wären die
Strings dynamisch alloziert hättest du da ein prima Speicherleck. Für
den Fall müsste es so aussehen:
#include
#include
void tester(char **t)
{
if(t != NULL)
{
if(*t != NULL)
free(*t)
*t = strdup("langer string);
}
}
int main (int argc, char* argv[])
{
char *field;
field = strdup("teststring");
puts(field);
tester(&field);
puts(field);
free(field);
return 0;
}
Natürlich ist das alles ohne jegliche Fehlerprüfung.
Philipp
--
Philipp Thomas work: pthomas@suse.de
Development SuSE Linux AG private: philippt@t-online.de