0

以下のコードを負の int 値で実行すると、セグメンテーション違反が発生します。なぜこれが起こっているのかをトラブルシューティングする方法に困惑しています。

このメソッドの目的は、符号付きをバイナリ文字列表現に変換することです。この関数は正の数に対して機能しますが、負の数に対してセグメンテーション違反を起こします

関数呼び出し:

int_to_binary(-1, "00000000000000000000000000000000\0");

ソース:

#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 33

int int_to_binary(int input, char* output) 
{
  output += BUFFER_SIZE - 1;

  while(input) 
  {
    --output;

    if(input & 1) 
    {
      (*output)++;
    }

    input >>= 1;
   }

  return 0;
}

int が 0 に等しくない場合にのみポインターをデクリメントしています。これは、変換する値がまだあることを意味します。Linux でこれをデバッグする方法についてのヘルプをいただければ幸いです。

4

4 に答える 4

3

This code is shouting segfault.

Your buffer is not even a buffer, its a hardcoded and supposedly read-only string that you don't even have a pointer reference from the caller. You shouldn't be writing to it.

And when you shift a signed number its not really a binary shift. input will never stop being -1.

What you need to do to shift it properly is:

input = (unsigned int)input >> 1;
于 2013-10-14T19:43:43.633 に答える
1

ポインター値 ( --output) を変更して、適切に定義されていない他のメモリ ロケーションを指すようにし、このメモリ ロケーション ( (*output)++) の値を変更しようとすると、segfault が発生します。

于 2013-10-14T19:43:05.530 に答える
1

input >>= 1負の数に対して左から 1 をシフトする (算術シフト)ため、無限ループに陥っている可能性があります。これにより、outputバッファがオーバーランします。

これが事実であることを確認するには、デバッガーでループをステップ実行inputし、シフトによってどのように変更されるかを調べます。

于 2013-10-14T19:33:27.717 に答える
0

関数の先頭にキャストinputしてみてくださいunsigned int

于 2013-10-14T19:37:06.510 に答える