Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » String in Funktion ändern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.10.2016, 00:37 Uhr
pagyei



Hallo,

wenn ich einen String an eine Funktion übergebe dessen länge sich innerhalb der funktion vergrössere muss ich die Anfangsadresse wieder zurückgeben oder bekommt der Zeiger die automatisch mit.

C++:
int main(void) {
  char *string = malloc(sizeof(char)*5);
  strcpy(string, "bsps");
  func(string);
  return EXIT_SUCCESS;
}

void func(char *string) {
  string = realloc(sizeof(char)*20);
  strcpy(string, "langer String");
}



Wenn sich die Anfangsadresse des Strings beim realloc ändert, bekommt das der Zeiger in der Main-Funktion mit oder nicht?

Felipe

-----
Edit: cpp-Tags eingefügt.

Dieser Post wurde am 30.10.2016 um 09:03 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.10.2016, 12:06 Uhr
~nussschale
Gast



Zitat:
Wenn sich die Anfangsadresse des Strings beim realloc ändert, bekommt das der Zeiger in der Main-Funktion mit oder nicht?

Nein, das bekommt die main() nicht mehr mit. Dazu würde ich an deiner Stelle am besten einen Pointer auf einen Pointer setzen, schließlich möchtest du einen Pointer ändern.

sizeof(char) ist standarddefiniert übrigens immer 1.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.10.2016, 19:27 Uhr
ao

(Operator)


Außerdem benutzt du realloc falsch. Erstens musst du zwei Parameter übergeben, nicht nur einen. Zweitens musst du das Ergebnis auf NULL testen, bevor du den Speicher beschreibst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.10.2016, 21:07 Uhr
pagyei



Ja richtig, jetzt wo es sagst, das hatte ich schon richtig gemacht nur als ich das Beispiel für das Forum getippt habe, dass ja sehr vereinfacht das darstellt was mir unklar war, muss ich das übersehen haben.

Der Test ist natürlich auch wichtig, allerdings habe ich noch keine Engpäße bei der Speicheranforderung erlebt, der Server hat genug, die Speicherauslastung liegt bei nur 6% und Swappartitionen gibt es auch noch.

Ich werden das aber künftig berücksichtigen.

Danke für den Hinweis des Doppelzeigers, so hatte ich das noch nicht gesehen. Diese Lösung erscheint mir als die Beste.

Das sizeof(char) immer äquivalent zu 1 ist mir auch klar, jedoch mache ich das aus Gewohnheit identisch mit anderen Datentypen.

Felipe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.10.2016, 22:03 Uhr
ao

(Operator)


Im Fall von realloc ist auch die Überlegung wichtig, was mit dem alten Speicherinhalt passieren soll bzw. muss, falls die Vergrößerung fehlschlägt.

Bei deiner Implementierung (string = realloc (...)) zeigt string in diesem Fall auf NULL, und der alte Inhalt ist unwiederbringlich verloren (je nach Applikation würdest du ihn in dem Fall noch brauchen, um Schadensbegrenzung zu betreiben!) und der Speicher kann noch nicht mal mehr gefree't werden, weil du keinen Pointer mehr darauf hast. Du hast also zusätzlich zum fehlgeschlagenen alloc noch ein Speicherleck, was deine ohnehin schon prekäre Speichersituation weiter verschlimmern dürfte.

Der Test auf NULL ist also in diesem Fall KEINE reine Formsache.

Richtig ist, realloc folgendermaßen zu benutzen:


C++:
int func (char ** newString, char * oldString, int newSize)
{
    *newString = realloc (oldString, newSize);
    return (*newString != 0);
}


Nur wenn *newString = realloc(...) erfolgreich verläuft, darfst du oldstring anschließend vergessen. Wenn realloc fehlschlägt, musst du dich selbst um die weitere Verwaltung von oldString kümmern.

Dieser Post wurde am 30.10.2016 um 22:05 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: