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