char
をwchar
に変換するためにswprintf
を呼び出した後、ループを呼び出すとセグメンテーションフォールトがトリガされます。ループヘッダー内のステートメントは、ループのコンテキスト外で正常に動作します。 swprintf
コマンドは、戻り値(3、which is the number of characters written to the output buffer up to the terminating null character)に基づいて成功しています。これは、ループの行を削除してセグメンテーション違反を防ぐことで確認できます。それにもかかわらず、後に(またはそれ以前に)呼び出されるfor
またはwhile
ループは、セグメント化エラーを生成します。この問題は、char* string
をchar string[4]
に変更することで解決されると思われ、問題の原因としてポインタが関与しています。しかし、私のユースケースでは、char配列よりむしろcharポインタを使用したいと思います。奇妙なことに、char*
からchar string[4]
への変化と同時にループが除去されると、セグメンテーション・フォールトが発生します。したがって、不正な形式のswprintf
ステートメントのために、未定義の動作が発生している可能性があります。このステートメントが正しく書かれているかどうか、そしてそのステートメントが不正である場合、それにもかかわらず期待される戻り値を生成するのはなぜですか?C: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
}
}
注:この
wchar_t* string_w;
この
swprintf(string_w, 4, L"%hs", string);
なし(Debianの6.2.1-5)6.2.1 20161124.
回答を確認してください。あなたは 'wchar_t * string_w'ポインタのためにメモリを割り当てていません –
' main() '関数(Visual Basicが許すものにかかわらず)には有効なシグネチャしかありません。 「無効」ではない。 'gcc'コンパイラがその問題について警告していたはずです。 – user3629249