使用 unsigned long long int 在 C 中出现分段错误?
Getting a segmentation fault in C with unsigned long long int?
我正在尝试用 C 编写十进制到二进制转换器的代码。我必须使用 unsigned long long int,因为我必须能够计算的最大数字是 18,446,744,073,709,551,615。在教授让我们使用的 Linux 服务器上,它说存在分段错误,在 CLion 调试器上它说“Exception = EXC_BAD_ACCESS (code=2, address=0x7ff7bc694ff8)”并声称 i = {unsigned long long} 18446744073708503289,这是不对的。无论 userInput 是多少,它都会执行此操作。
我目前拥有的:
#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。任何尝试使用这样的数组都会触发 undefined behavior,在这种特殊情况下导致崩溃。
您最多需要存储 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
将永远为真,它会永远循环,读取内存直到达到内存分段不允许它读取的内容。
我正在尝试用 C 编写十进制到二进制转换器的代码。我必须使用 unsigned long long int,因为我必须能够计算的最大数字是 18,446,744,073,709,551,615。在教授让我们使用的 Linux 服务器上,它说存在分段错误,在 CLion 调试器上它说“Exception = EXC_BAD_ACCESS (code=2, address=0x7ff7bc694ff8)”并声称 i = {unsigned long long} 18446744073708503289,这是不对的。无论 userInput 是多少,它都会执行此操作。
我目前拥有的:
#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。任何尝试使用这样的数组都会触发 undefined behavior,在这种特殊情况下导致崩溃。
您最多需要存储 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
将永远为真,它会永远循环,读取内存直到达到内存分段不允许它读取的内容。