使用malloc函数查找可用内存空间

时间:2014-02-15 09:22:10

标签: c memory-management segmentation-fault malloc

所以基本上我想在我的计算机上找到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),我真的不知道为什么会发生这种情况,如果有人能指出我错在哪里,我会非常感激。 谢谢:)

4 个答案:

答案 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实际上在没有剩余空间的地方成功。如果您的变量描述了它们包含的内容并且实际上与该描述相匹配,那么该错

但实际上,整个方案并没有给你任何有用的东西,因为大多数操作系统都会让你分配大量的内存 - 只要你不使用它。如果你使用太多,有些会崩溃,有些会慢慢爬行。