On Thu, 18 Jul 2002 at 14:24 (+0200), Volker Kroll wrote:
Wenn ich einer Funktion einen Pointer übergebe, sollte diese doch den
Inhalt des Pointers ändern können.
Nein. Du kannst nicht den Inhalt des Pointers verändern (d. h. die
Adresse, auf die verwiesen wird) sondern nur den Inhalt des Textes,
indem der Speicher verändert wird, auf den der Pointer zeigt.
Siehe:
,----[ test.c ]-
| #include
| void tester(char*);
| int main (int argc, char* argv[])
| {
| char *field = "teststring";
| printf("field zeigt auf %u\n", (unsigned int) field);
| tester(field);
| //printf("String: %s\n", field);
| printf("field zeigt auf %u\n", (unsigned int) field);
| /* prints teststring not langer String */
| return 0;
|
| }
|
| void tester(char* test) {
| test = "langer String";
|
| printf("test zeigt auf %u\n", (unsigned int) test);
| }
`----
bwalle [~] $ ./test
field zeigt auf 134513908
test zeigt auf 134513939
field zeigt auf 134513908
Da field nach wie vor auf 134513908 zeigt und dort der Text
unverändert ist, bringt das Ganze nichts.
Du kannst z. B. folgendermaßen vorgehen:
,----[ test2.c ]-
| #include
| #include
| #include
|
| void tester(char*);
|
| int main (int argc, char* argv[])
| {
| // Zeiger deklarieren
| char * field;
| char text[] = "teststring";
|
| // Speicher anfordern
| // nur dynamisch verwalteter Speicher kann in der
| // Groesse veraendert werden (realloc(3))
| if ((field = (char *)malloc(sizeof(char) * strlen(text) + 1))
| == NULL)
| {
| fprintf(stderr, "nicht genug Speicher\n");
| return(1);
| }
|
| tester(field);
| printf("String: %s\n", field);
| /* prints teststring not langer String */
| return 0;
|
| }
|
| void tester(char* test) {
| char *test2 = "langer String";
|
| // Groesse des Speichers veraendern
| if (realloc(test, sizeof(char) * strlen(test2) + 1) != test)
| {
| fprintf(stderr, "Anderer Speicherbereich. Kein Sinn.\n");
| exit(1);
| }
|
| strcpy(test, test2);
|
| }
`----
Wieder ohne irgendwelche Garantieren. Man möge mich korrigieren.
Funktionieren tut's:
bwalle [~] $ test2
String: langer String
Gruß,
Bernhard
--
"Freedom is just another word for nothing left to lose,
Nothing don't mean nothing honey if it ain't free, now now.
And feeling good was easy, Lord, when Bobby sang the blues,
You know feeling good was good enough for me,
Good enough for me and my Bobby McGee." -- Janis Joplin