2017-03-03 3 views
1

charwcharに変換するためにswprintfを呼び出した後、ループを呼び出すとセグメンテーションフォールトがトリガされます。ループヘッダー内のステートメントは、ループのコンテキスト外で正常に動作します。 swprintfコマンドは、戻り値(3、which is the number of characters written to the output buffer up to the terminating null character)に基づいて成功しています。これは、ループの行を削除してセグメンテーション違反を防ぐことで確認できます。それにもかかわらず、後に(またはそれ以前に)呼び出されるforまたはwhileループは、セグメント化エラーを生成します。この問題は、char* stringchar 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.

+2

回答を確認してください。あなたは 'wchar_t * string_w'ポインタのためにメモリを割り当てていません –

+1

' main() '関数(Visual Basicが許すものにかかわらず)には有効なシグネチャしかありません。 「無効」ではない。 'gcc'コンパイラがその問題について警告していたはずです。 – user3629249

答えて

3

:私はgccを使用してコンパイルしていますstring_wが有効なメモリを指していることが問題のレシピです。 string_wを正しく初期化する必要があります。

wchar_t* string_w = malloc(SOME_PROPER_SIZE); 
+0

お互いに感謝します。 – user001

3

あなたがスペースを割り当てる必要があることstring_wポイントへ。そのままでは特にポインタを指しません。

+0

お互いに感謝します。 – user001

関連する問題