使用 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将永远为真,它会永远循环,读取内存直到达到内存分段不允许它读取的内容。