最近,在C中,我一直在学习动态内存位置。
我还了解了limits.h
标准库。
在分配内存时,为什么不这样做:char array[INT_MAX]
而不是试图让内存整洁,完美地满足您的使用目的?
我知道计算机上可用的内存不足,但在动态分配内存时也可能发生这种情况。
请在答案中加入关于效率的评论。
以下是一段代码示例:
#include <stdio.h>
#include <limits.h>
#include <string.h>
int main(void) {
FILE *fp;
char buff[255];
char str[INT_MAX];
fp = fopen("input.txt", "r");
if(fp) {
while(fgets(255, buff, fp)) {
strcat(str, buff);
}
}
printf("%s\n", str);
return 0;
}
这是一个读取文件并将其所有内容放入一个字符串的示例。
注意:此代码未编译,因此如果存在任何错误,请忽略它们 - 我已经解释了代码应该执行的操作。
答案 0 :(得分:2)
因为它与使用重型卡车移动一个小盒子一样高效...如果你想送一个盒子或搬离你的家,你几乎总是要求别人去做。当你饿了,我很确定你从不要求餐厅提供所有食物。
好的,你可以在一次分配中分配尽可能多的内存,但现在:你将如何管理这个巨大的块?您肯定会有这样的需求,例如将此部分用作整数,这个用于存储给定的结构等。这将导致您自己实现某种内存管理。我确定你不愿意这样做。
你还必须考虑资源共享,如果你消耗所有可能的资源,但超过你需要的资源,其他一些人将会处于饥饿状态。
你把一个非常庞大的文件的整个内容放入内存的场景几乎是不现实的,几乎不需要这样的东西。无论如何,如果你真的需要这个,你可能会使用一个内存映射文件而不是这样的&#34;读取存储&#34;算法
答案 1 :(得分:0)
为每个字符串分配最大缓冲区大小的建议让我想到了一个晚宴,主持人并不知道每位客人会喝多少酒,所以每个人都要点一桶。餐厅里摆满了酒桶,没有其他任何空间,包括客人。
内存是一种必须管理的资源,因此您不会耗尽。或者即使您没有用完,分配的内存超出了您的需求,也会导致系统因为将内存交换到磁盘而导致其他应用程序无法运行而导致系统速度变慢。
答案 2 :(得分:0)
您是在谈论分配一个大型阵列并根据需要进行分割?或者分配多个INT_MAX
元素数组?
您要避免的主要内容是内部碎片。假设您要存储100个字符串,其中最长的字符串为50个字符。你当然可以声明一个像
这样的数组char strings[100][51]; // +1 for 0 terminator
并完成它,但假设你只有1个字符串实际上是50个字符长,其余的是5个字符长。你最终浪费了80%的空间。这个问题是否取决于你正在做什么,但如果没有其他问题,它就是不优雅的。