用无符号长整型在C中得到分段错误



我试图用C编写一个十进制到二进制的转换器。我必须使用无符号长整型,因为我必须能够计算的最大数字是18446744073709551615。在我的教授让我们使用的Linux服务器上,它说存在分段故障,而在CLion调试器上,它会说";异常=EXC_BAD_ACCESS(代码=2,地址=0x7ff7bc694ff8(";并且声明i={unsigned long-long}18446744073708503289,这是不对的。无论用户输入是多少,它都会这样做。

我目前拥有的:

#include <stdio.h>
int main(void)
{
unsigned long long int userInput;
unsigned long long int i;
unsigned long long int binary[] = {};
printf("Enter a number from 0 to 18,446,744,073,709,551,615: ");
scanf("%lld", &userInput);
printf("nThe binary value of %lld is: ", userInput);
if (userInput == 0)
{
printf("0");
}
else
{
for (i = 0; userInput > 0; i++)
{
binary[i] = userInput%2;
userInput = userInput/2;
}
for (i -= 1; i >= 0; i--)
{
printf("%lld", binary[i]);
}
}
printf("n");
return 0;
}

因为没有给binary显式的大小,而是给了一个空的初始值设定项列表,所以数组的大小为0。任何使用此类数组的尝试都会触发未定义的行为,在这种特殊情况下会导致崩溃。

您需要存储多达64个二进制数字,因此使数组具有该大小。

unsigned long long int binary[64];

另一个问题是在这个条件下:

for (i -= 1; i >= 0; i--)

因为i具有unsigned类型,所以条件i >= 0将始终为真。因此,将i的类型更改为int

int i;

一个问题是其中一个循环永远无法终止:

unsigned long long int i;
// ...
for (i -= 1; i >= 0; i--)
{
printf("%lld", binary[i]);
}

变量i是无符号的,并且永远不能为负数。因此,i >= 0将始终为真,并且它将永远循环,读取内存,直到它达到内存分段不允许它读取的东西。

最新更新