在使用负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中调试它的帮助将不胜感激。
答案 0 :(得分:3)
此代码正在大喊段错误。
你的缓冲区甚至不是缓冲区,它是一个硬编码的,据称是只读的字符串,你甚至没有来自调用者的指针引用。你不应该写它。
当你移动有符号数时,它实际上不是二进制移位。 input
永远不会停止-1
。
正确转移它需要做的是:
input = (unsigned int)input >> 1;
答案 1 :(得分:1)
你可能会遇到一个无限循环,因为input >>= 1
从左边移位一个负数(算术移位)。这将导致您超出output
缓冲区。
为了确保这种情况,您可以在调试器中逐步执行循环,并检查移位后input
的更改方式。
答案 2 :(得分:1)
您更改指针值(--output
)以指向其他一些未明确定义的内存位置,然后尝试更改此内存位置((*output)++
)的值,这会导致段错误
答案 3 :(得分:0)
尝试在功能开始时将input
投射到unsigned int