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)++) 的值,这会导致段错误。

于 2013-10-14T19:43:05.530 回答
1

您可能会陷入无限循环,因为input >>= 1从左侧移入负数(算术移位)。这将导致您溢出output缓冲区。

为了确保是这种情况,您可以在调试器中单步执行循环并检查input移位如何改变。

于 2013-10-14T19:33:27.717 回答
0

尝试在函数的开头强制转换inputunsigned int

于 2013-10-14T19:37:06.510 回答