[英]Find free memory space using malloc function
所以基本上我想在我的计算机上找到Gb的数量(只是整个Gbs,忽略分数Gb),使用malloc()函数。 在这里我们使用的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argv, char **argc) {
unsigned long size = 0;
void *part[1000];
int i = 0;
part[size] = (void *)malloc(1024*1024*1024);
if(part[size] == 0)
printf("The computer has less than 1 Gb of free memory\n");
else {
while((part[size] != NULL) && (size<1000)) {
size++;
part[size] = (void *)malloc(1024 *1024 *1024);
}
while(i <= size) {
free(part[size]);
}
printf("The computer has %luGb of free memory\n", size);
}
return 0;
}
结果是分段错误(Core dumped),我真的不知道为什么会发生这种情况,如果有人能指出我错在哪里,我会非常感激。 谢谢 :)
您正在获得分段错误,因为您释放了已经释放的内存。 更新你的第二个while
循环到
while(i <= size) {
free(part[i]);
i++;
}
正如评论中所提到的,这不会为您提供系统上有多少可用内存,因为操作系统会为进程分配虚拟地址空间,而不保证存在物理存储空间。 这称为内存过量使用。 在这里详细阅读 - 什么是Overcommit?
另外,你不应该转换malloc
的结果。 没有任何好处,如果您忘记包含stdlib.h
头文件,它可能会导致错误。 请阅读这个我应该转换malloc的结果吗?
更改:
while(i<=size)
free(part[size]);
至:
for (i=0; i<size; i++)
free(part[i]);
顺便说一句,我认为它不会给你计算机上的免费GB数量,而是分配给这个进程的堆上的空闲GB数量。
下面的循环是无限的。 循环没有破坏条件。
while(i<=size){
free(part[size]);
}
将其更改为
long size = 0; //change to to long from unsigned long to make sure below loop would work.
while(size >= 0){
free(part[size]);
size--;
}
如果malloc成功1000次,您的代码将写入数组“part”的末尾。
如何命名变量的方式非常令人困惑。 尺寸大小是什么? 它根本不是一个尺寸。 这是成功的malloc'ed块的计数。 称之为:mallocedBlockCount。 现在你知道它是什么了,它使你的代码更清晰,你的错误更加明显。
很明显,大小实际上不是成功的malloc'ed块的数量,而是一个更少。 结果,测试大小<1000在实际上没有剩余空间的点处成功。 如果您的变量描述了它们包含的内容并且实际上与该描述相匹配,那么该错
但实际上,整个方案并没有给你任何有用的东西,因为大多数操作系统会让你分配大量的内存 - 只要你不使用它。 如果你使用太多,有些会崩溃,有些会慢慢爬行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.