2017-07-27 3 views
-3

Ich habe eine Member-Variable, die auf ein Array wchar_t zeigt, die eine Eingabe vom Benutzer über die Konsole enthalten wird.Zugriffsverletzung Schreibort mit dynamischem Array

wchar_t ** mArray; 

Dann in meiner Member-Funktion, bitte ich um die Eingabe vom Benutzer und speichere sie in einem std :: wstring. Danach verwende ich die Länge dieses wstring, um Speicher für mArray dynamisch zuzuweisen, und jedes Zeichen in einer for-Schleife zuzuweisen. Ich bekomme jedoch einen "Zugriffsverletzung Schreibort" -Fehler.

std::wstring givenWstring; 
std::cin.ignore(); 
std::getline(std::wcin, givenWstring); 
mArray = new wchar_t*[givenWstring.length()]; 
for (size_t i = 0; i < givenWstring.length(); i++) { 
    *mArray[i] = givenWstring.at(i); 
} 

Ich weiß nicht, warum ich eine Zugriffsverletzung Störung erhalten, weil ich jedes Zeichen aus dem wstring in der dynamischen Array zu jedem Index am zuweisen.

+0

Vielleicht 'wchar_t * mArray;' ist was Sie brauchen? Dann einfach 'mArray = new wchar_t [givenWstring.length()];' und 'marray [i] = givenWstring.at (i);'. – DimChtz

+0

Ihr Array enthält ** nicht initialisierte ** 'givenWstring.length()' ** Zeiger ** auf 'wchar_t'. Wenn Sie versuchen, den Zeiger zu dereferenzieren ('* mArray [i]') - erhalten Sie undefiniertes Verhalten. –

+0

@DimChtz, tut mir leid. Schlägst du vor, dass ich stattdessen wchar_t * benutze? – Skipher

Antwort

1

Sie müssen die Daten in einem dynamischen Array von geeigneten Objekten speichern, wchar_t in Ihrem Fall. I.e. Sie benötigen einen Zeiger auf wchar_t, um dieses Array zu verwalten.

std::unique_ptr<wchar_t[]> mArray; // unique_ptr takes care of delete[] 
std::wstring givenWstring; 
std::cin.ignore(); 
std::getline(std::wcin, givenWstring); 
mArray.reset(new wchar_t[givenWstring.length()+1]); 
for(size_t i = 0; i < givenWstring.length(); i++) 
    mArray[i] = givenWstring.at(i); 
mArray[givenWstring.length()] = 0; 

Allerdings gibt es kein denkbarer Grund für eine solche Konstruktion. Bei weitem der beste Weg, um ein Array von wchar_t zu halten ist ein std::wstring. Moveover, wenn Sie eine Darstellung wie ein roher const wchar_t* (C-String), dann können Sie std::string::c_str(), zum Beispiel

void old_code(const wchar_t*);  // some old API 
old_code(mArray.c_str()); 

Schließlich verwenden, ich soll erklären, warum Sie die Zugriffsverletzung erhalten.

wchar_t**mArray = new wchar_t*[givenWstring.length()]; 

weist ein Array von wchar_t*, die nicht initialisiert werden (und somit einige zufällige Daten enthalten). Dann gibt *mArray den ersten dieser zufällig initialisierten Zeiger zurück, wenn *mArray[0]=... versucht, in den Speicher an dieser zufälligen Adresse zu schreiben.

+0

Vielen Dank für Ihren Einblick in die Verwendung von unique_ptr für dieses Problem. Ist es jedoch möglich, dies ohne Verwendung von unique_ptr zu lösen? Ich würde gerne einfach lernen. Und ja, ich mag es auch nicht, Zeichensätze über Zeichenketten zu verwenden, aber ich musste, weil eine bestimmte SDK-Funktion solche benötigt. – Skipher

+0

Also, warum brauchen Sie das Array für * eine bestimmte SDK-Funktion *? Wenn ein Software-Entwicklungskit schlechte Programmierverfahren fördert (z. B. Verwendung roher Dynamik-Arrays zugunsten von Containern), sollten Sie es nicht verwenden. – Walter

+0

@Blastofence In der Tat. Danke, dass du darauf hingewiesen hast. Jetzt behoben. – Walter

Verwandte Themen