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.
Überprüfen Sie die Antworten. Sie reservieren keinen Speicher für 'wchar_t * string_w' Pointer –
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