2017-12-25 4 views
0

Ich habe ein seltsames Problem. Ich zuteilen char [] Werte in struct Array, aber sie erhalten verloren: ------- Die Struktur dieses ist:C++ Strukturwerte verloren

typedef struct _Settings 
{ 
    const char* str; 
    uint val; 
}Settings; 

------- ich es wie folgt zu erstellen:

int nn=10; 
settings = new Settings[nn]; 
for (int i = 0; i < nn; i++) { 
     string strr = "thisOneIs"; 
     strr.append(std::to_string(i)); 
     settings[i].str = strr.c_str(); 
     string teststr = settings[i].str; //// (1) 
     settings[i].val = i + 1; 
} 

..... bei (1), bekomme ich die richtigen Werte.

Aber wenn ich diese dann rufen Sie (an gleicher Stelle, direkt nach dem Code oben), werden die Einstellungen [i] .str ist leer:

for (int i = 0; i < nn; i++) { 
     string teststr = settings[i].str;  ///// (2) 
     std::cout << settings[i].str << "=" << settings[i].val << "\n"; 
    } 

... bei (2), I leer zu bekommen.

Hat jemand eine Ahnung warum? Vielen Dank!

+1

STRR ist eine lokale Variable mit der automatischen Speicherdauer. Sein Anwendungsbereich ist der Blockcode der for-Schleife. Nach dem Verlassen der Schleife ist die Variable nicht mehr aktiv und der entsprechende Zeiger ist ungültig. –

+1

'const char * str' ist ein Zeiger, den Sie auf das temporäre Objekt richten, das am Ende des Oszilloskops zerstört wird. Was erwarten Sie? –

+0

Sie haben Recht. Aber wie kann ich den String-Wert von strr dauerhaft in settings [i] .str kopieren? – Steve

Antwort

2

Die Zeile bei (1) ist ein Problem, weil Sie einen Zeiger auf etwas Speicher speichern, der nicht gültig ist, wenn die Schleife endet.

string strr = "thisOneIs";  // A temporary object in the loop. 
strr.append(std::to_string(i)); 
settings[i].str = strr.c_str(); // Pointer that won't be valid when the loop ends. 

Wenn Sie sich über geringe Sprachfunktionen zu lernen, dann ist es in Ordnung, mit der Verwendung von char* und rohen Speicher zu experimentieren. Wenn Sie versuchen, ein Arbeitsprogramm zu erhalten, verwenden Sie einfach std::string.

Vereinfachen Sie auch die Definition von Settings. Sie brauchen nicht alle typedef non-sense in C++.

struct Settings 
{ 
    std::string str; 
    uint val; 
}; 
+0

Danke! Leider muss ich diese Typedef für Einstellungen verwenden - es ist für die Schnittstelle mit Legacy-Software (Aufruf von. DLL-Funktionen mit dieser Art von Sachen). Wie könnte ich den String-Wert von strr dauerhaft in Einstellungen [i] .str kopieren, anstatt nur Zeiger? – Steve

+0

@Steve, Sie müssen diese Zeichenfolge kopieren. Suche 'strdup' im Netz. –

+0

char * strdup (const char * str1); Duplikate str1. Aber in meinem Fall habe ich eine Zeichenfolge: strr. Was auch immer in dieser Zeichenfolge ist, muss in const char * str in der Struktur platziert werden: settings [i] .str ... also lautet die Frage: Wie wird eine Zeichenkette in const char * kopiert? Sorry, wenn ich falsch verstanden habe .. – Steve

Verwandte Themen