将负int转换为二进制时出现分段错误

时间:2013-10-14 19:23:36

标签: c segmentation-fault

在使用负int值运行下面的代码时,我遇到了分段错误。我很难过如何解决为什么会发生这种情况。

此方法的目标是将signed转换为二进制字符串表示形式。此函数适用于正数但负数上的段错误

函数调用:

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

的Src:

#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 个答案:

答案 0 :(得分:3)

此代码正在大喊段错误。

你的缓冲区甚至不是缓冲区,它是一个硬编码的,据称是只读的字符串,你甚至没有来自调用者的指针引用。你不应该写它。

当你移动有符号数时,它实际上不是二进制移位。 input永远不会停止-1

正确转移它需要做的是:

input = (unsigned int)input >> 1;

答案 1 :(得分:1)

你可能会遇到一个无限循环,因为input >>= 1从左边移位一个负数(算术移位)。这将导致您超出output缓冲区。

为了确保这种情况,您可以在调试器中逐步执行循环,并检查移位后input的更改方式。

答案 2 :(得分:1)

您更改指针值(--output)以指向其他一些未明确定义的内存位置,然后尝试更改此内存位置((*output)++)的值,这会导致段错误

答案 3 :(得分:0)

尝试在功能开始时将input投射到unsigned int