C 当内存不足时,计算机会冻结

C 当内存不足时,计算机会冻结,c,ubuntu,memory,C,Ubuntu,Memory,我正在尝试运行一个C程序,该程序根据用户提供的输入对内存进行malloc 每当我输入100000000大的东西而不是返回空值时,我的Ubuntu 14.04机器就会完全冻结!我敢肯定马洛克是罪魁祸首 但是我很惊讶地看到Ubuntu冻结了 有人知道为什么会发生这种情况吗 我有一台带有12GB内存、i5处理器和500GB硬盘的笔记本电脑。和Ubutnu 14.04 OS 代码如下: #include<stdio.h> #include<stdlib.h> #define LE

我正在尝试运行一个C程序,该程序根据用户提供的输入对内存进行malloc

每当我输入100000000大的东西而不是返回空值时,我的Ubuntu 14.04机器就会完全冻结!我敢肯定马洛克是罪魁祸首

但是我很惊讶地看到Ubuntu冻结了

有人知道为什么会发生这种情况吗

我有一台带有12GB内存、i5处理器和500GB硬盘的笔记本电脑。和Ubutnu 14.04 OS

代码如下:

#include<stdio.h>
#include<stdlib.h>
#define LEFT(x) (2*(x)+1)
#define RIGHT(x) (2*(x)+2)

long long int *err, *sorted, *size, *id;
short int *repeat;

void max_heapify(long long int *arr, long long int length, long long int index)
{
  long long int largest, left, right, temp, flag = 1;

  while (flag)
    {
      left = LEFT(index);
      right = RIGHT(index);

      if (left < length && arr[left] > arr[index])
    largest = left;
      else
    largest = index;

      if (right < length && arr[right] > arr[largest])
    largest = right;

      if (largest != index)
    {
      temp = arr[index];
      arr[index] = arr[largest];
      arr[largest] = temp;
      index = largest;
    }
      else
    flag = 0;
    }
}

void build_max_heap(long long int *arr, long long int length)
{
  long long int i, j;
  j = (length / 2) - 1;
  for (i = j; i >= 0; i--)
    max_heapify(arr, length, i);
}

void heapsort(long long int *arr, long long int length)
{
  long long int i, temp, templength;

  build_max_heap(arr, length);

  templength = length;
  for (i = 0; i < templength; i++)
    {
      temp = arr[0]; // maximum number
      arr[0] = arr[length - 1];
      arr[length - 1] = temp;
      length--;
      max_heapify(arr, length, 0);
    }
}

int main()
{
  long long int n, k, p, i, j;
  scanf("%lld%lld%lld",&n, &k, &p);
  err = (long long int*)malloc((n + 1) * sizeof(long long int));
  //repeat = (short int*)calloc(1000000001 , sizeof(short int));
  sorted = (long long int*)malloc((n + 1) * sizeof(long long int));
  j = 0;
  for(i = 0; i < n; i++)
    {
      scanf("%lld",&err[i]);
      sorted[j++] = err[i];
    }

  heapsort(sorted, j);

  for(i = 0; i < j; i++)
    printf("%lld, ",sorted[i]);

  //These malloc statements cause the problem!! 
  id = (long long int*)malloc((sorted[j - 1] + 1) * sizeof(long long int));
  size = (long long int*)malloc((sorted[j - 1] + 1) * sizeof(long long int));

  for(i = 0; i <= sorted[j - 1]; i++)
    {
      id[i] = i;
      size[i] = 1;
    }

  return 0;
}
它冻结了ubuntu。我甚至添加了检查id或大小是否为空的条件,但这没有帮助!若系统无法分配那个么多内存,那个么它应该返回NULL,但系统会冻结!这段代码在MAC上运行良好


谢谢

你说的冻结到底是什么意思?你还能移动鼠标光标吗?你们能不能把代码压缩成一个基本的主函数,使用硬编码参数调用两个malloc,看看它是否仍然冻结?如果真的是mallocs导致了这个问题,那么所有堆排序相关的代码对于复制来说都是不必要的,我无能为力!我不能移动鼠标,我不能打开终端,我别无选择,只能硬复位!是的,我减少了代码,但代码有效!那么,最短的复制案例在哪里呢。如果你不知道的话,1000000000*sizeoflong的分配量超过了7.62GB,你至少做了两次。在分页存储中交换该内存可能需要相当长的时间。如果您所说的是真的,那么大约95%的代码不需要重现您的问题,所以开始剪切。@WhozCraig如果系统无法分配那么多内存,那么它应该返回NULL为什么冻结?或者是因为12GB内存导致我的MAC只有4GB内存,并且返回空值@harrythomas我认为它可以分配这么多内存,而不是RAM,而且看不到相反的证据。如果这是64位编译。这是可行的,但效率极低。如果是32位编译,您可能会面临大小计算溢出,并且进程可能/应该呕吐。
5 5 5 

1000000000 999999999 999999997 999999995 999999994