繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM