2017-09-20 12 views
0

これは私が試したことですが、私の論理はtmp左に31回シフトするとユーザ入力整数Iと比較され、値1または0がインデックスに挿入されますstr[0]->str[31]であり、Iヌルは、\0を有するstr[32]で終了する。整数をcでバイナリ文字列に変換する

ただし、セグメント違反が発生しています。

P.S.私はこの関数のパラメータを変更することは許されておらず、私の教授はstrのサイズをメインで33に設定しました。どちらも変更できません。

void int2bitstr(int I, char *str) { 
     int tmp = 1 << 31; 
     do{ 
       *str++ = !!(tmp & I) + '0'; 
     } while(tmp >>= 1); 
     *str = '\0'; 
} 
+3

'int'が署名されています。あなたはそれを忘れましたか? –

+0

私はいつも[Valgrind](https://www.valgrind.org)を使ってsegfaultsを理解しています –

+1

Eugeneが言っていることを踏まえて、 'tmp'の値をコンソールに出力すると出力に驚くでしょう各反復は、特にループ出口節を考慮して行います。 – WhozCraig

答えて

1

tmpunsigned intを作ってみましょう。負の(符号付き)整数を右シフトする動作は、実装定義であり、1秒(元のMSB)にシフトしてループがstrの長さを超える可能性があります。

+1

'int tmp = 1 << 31;' -->' unsigned tmp = 1u << 31;(必ず1uに変更してください) – chux

+0

ありがとう!プログラムはうまくいきました。私はこれを忘れるとは信じられません。 –

関連する問題