所以基本上我想在我的计算机上找到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),我真的不知道为什么会发生这种情况,如果有人能指出我错在哪里,我会非常感激。 谢谢:)
答案 0 :(得分:2)
您正在获得分段错误,因为您释放了已经释放的内存。
将第二个while
循环更新为
while(i <= size) {
free(part[i]);
i++;
}
正如评论中所提到的,这不会为您提供系统上有多少可用内存,因为操作系统会为进程分配虚拟地址空间,而不保证其存在物理存储空间。这称为内存过量使用。请在此处详细阅读 - What is Overcommit?
此外,您不应该投射malloc
的结果。没有任何好处,如果您忘记包含stdlib.h
头文件,可能会导致错误。请阅读此Should I cast the result of malloc?
答案 1 :(得分:0)
变化:
while(i<=size)
free(part[size]);
要:
for (i=0; i<size; i++)
free(part[i]);
顺便说一句,我不认为它会为您提供计算机上的免费GB数量,但是为此过程分配的堆上的空闲GB数量。
答案 2 :(得分:0)
下面的循环是无限的。循环没有破坏条件。
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--;
}
答案 3 :(得分:0)
如果malloc成功1000次,您的代码将写入数组“part”的末尾。
如何命名变量的方式非常令人困惑。尺寸大小是什么?它根本不是一个尺寸。这是成功的malloc'ed块的计数。称之为:mallocedBlockCount。现在你知道它是什么了,它使你的代码更清晰,你的错误更加明显。
很明显,大小实际上不是成功的malloc'ed块的数量,而是少一个。结果,测试尺寸< 1000实际上在没有剩余空间的地方成功。如果您的变量描述了它们包含的内容并且实际上与该描述相匹配,那么该错
但实际上,整个方案并没有给你任何有用的东西,因为大多数操作系统都会让你分配大量的内存 - 只要你不使用它。如果你使用太多,有些会崩溃,有些会慢慢爬行。