mikrocontroller.net

Forum: PC-Programmierung Stringübergabe an putenv


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Ich hab da mal ne Frage zu putenv.

Kann ich das innerhalb einer Funktion so aufrufen?
void init()
{
  string blafalse = "Variable=Wert";
  putenv(blafasel);
}

In dem Beispiel wird der String ja nach Ende der Funktion gelöscht. Mir 
hat nun jemand (der eigentlich wirlich Ahnung von C++ hat) erzählt, dass 
der übergebene String erhalten bleiben muss. Davon hab ich allerdings 
noch nie was gehört, und auch beim googlen keinen Hinweis darauf 
gefunden, dass das so sein müsste.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, sollte natürlich
putenv(blafasel.c_str());
heißen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine man-page sagt dazu:
NOTES
       The putenv() function is not required to be reentrant, and  the  one  in  libc4,
       libc5 and glibc 2.0 is not, but the glibc 2.1 version is.

       Description for libc4, libc5, glibc: If the argument string is of the form name,
       and does not contain an '=' character, then the variable name  is  removed  from
       the  environment.  If putenv() has to allocate a new array environ, and the pre‐
       vious array was also allocated by putenv(), then it will be freed.  In  no  case
       will the old storage associated to the environment variable itself be freed.

       The  libc4  and  libc5  and  glibc  2.1.2 versions conform to SUSv2: the pointer
       string given to putenv() is used.  In particular, this string  becomes  part  of
       the environment; changing it later will change the environment.  (Thus, it is an
       error is to call putenv() with an  automatic  variable  as  the  argument,  then
       return from the calling function while string is still part of the environment.)
       However, glibc 2.0-2.1.1 differs: a copy of the string is used.  On the one hand
       this  causes  a  memory leak, and on the other hand it violates SUSv2.  This has
       been fixed in glibc 2.1.2.

       The 4.4BSD version, like glibc 2.0, uses a copy.

       SUSv2 removes the const from the prototype, and so does glibc 2.1.3.

Insofern würde ich mich da auf nichts verlassen und keine
temporären bzw. automatischen Variablen dafür nehmen,
sondern entweder globale Variablen, statische Variablen oder
Konstanten.

Nachtrag: ... oder Speicher allokieren und allokiert lassen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.