2017-03-03 2 views
1

Nach dem Aufruf swprintf zum Konvertieren char in wchar löst das Aufrufen einer Schleife einen Segmentierungsfehler aus; Die Anweisungen im Schleifenheader funktionieren außerhalb des Kontexts der Schleife. Der Befehl swprintf ist basierend auf dem Rückgabewert erfolgreich (3, which is the number of characters written to the output buffer up to the terminating null character), was durch das Entfernen der Zeilen für die Schleife bestätigt werden kann, um den Segmentierungsfehler zu verhindern. Nichtsdestoweniger erzeugt eine for oder while Schleife, die danach (oder vorher) aufgerufen wird, einen Segmentierungsfehler. Dieses Problem scheint gelöst zu werden, indem man char* string zu char string[4] ändert, einen Zeiger als die Quelle des Problems verweisend; In meinem Anwendungsfall würde ich jedoch lieber einen char-Zeiger als ein char-Array verwenden. Seltsamerweise folgt jedoch, wenn die Schleife zusammen mit der Änderung von char* zu char string[4] entfernt wird, ein Segmentierungsfehler. Daher tritt ein undefiniertes Verhalten auf, wahrscheinlich aufgrund einer fehlerhaften swprintf-Anweisung; Wie kann diese Aussage richtig geschrieben werden, und wenn die Aussage falsch ist, warum produziert sie dennoch den erwarteten Rückgabewert?C: Segmentierungsfehler in Verbindung mit `swprintf`

#include <stdio.h> 
#include <wchar.h> 

void main() { 

    char* string = "ABC"; 
    //char string[4] = "ABC"; 
    wchar_t* string_w; 
    swprintf(string_w, 4, L"%hs", string); 
    int retval = swprintf(string_w, 4, L"%hs", string); 
    printf("string: %ls\nreturn value: %d\n",string_w, retval); 

    for (int i = 0; i < 2; i++) { 
    // do nothing 
    } 

} 

Anmerkung: Ich bin Kompilieren gcc mit: (Debian 6.2.1-5) 6.2.1 20161124.

+2

Überprüfen Sie die Antworten. Sie reservieren keinen Speicher für 'wchar_t * string_w' Pointer –

+1

Es gibt nur ein paar gültige Signaturen für die' main() '-Funktion (unabhängig davon, was Visual Basic erlaubt) alle von ihnen haben einen Rückgabetyp von' int', nicht "ungültig". Der 'gcc'-Compiler sollte Sie vor diesem Problem gewarnt haben. – user3629249

Antwort

3

Diese

wchar_t* string_w; 

und diese

swprintf(string_w, 4, L"%hs", string); 

ohne machen string_w Punkt auf gültigen Speicher ist ein Rezept für ein Problem. Sie müssen string_w richtig initialisieren, bevor Sie es verwenden, z.

wchar_t* string_w = malloc(SOME_PROPER_SIZE); 
+0

Vielen Dank an Sie beide. – user001

3

Sie müssen den Raum, dass string_w Punkte vergeben; so wie es ist, ist es ein Zeiger, der nirgendwo anders zeigt.

+0

Danke an euch beide. – user001