【问题标题】:Gradual memory allocation strategy渐进式内存分配策略
【发布时间】:2017-05-30 22:18:25
【问题描述】:

出于教学目的,我正在开发一个从标准输入读取字符串(字符数组)的程序。目标是允许程序根据输入的维度顺序增加分配的内存。我想听听您对我的方法的意见。

我想我可以为每个需要的读取周期一个一个地分配一个字节的空间。显然,它不起作用。我该如何解决这个问题?是否值得一试?

感谢您的耐心和支持!

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int main(){
        char *q;
        int flag = 1, j = 0;
        printf("\n\nNow let's go for a word of undefined lenght. Type it:\n\n");
        do{
                q++ = calloc(1, sizeof(char));
                flag = ((q[j] = getchar()) != 0); #Until it is valid.
                ++j;
        }while(flag);
     return 0;
}

【问题讨论】:

  • 首先,阅读getchar() 的文档。完成后返回EOF,而不是零。第二个q++ = calloc(1, sizeof(char) 不增长缓冲区。它分配(并泄漏)一个,然后递增calloc() 返回的指针。
  • 感谢@Peter,这是一个非常有价值的建议。我没想过这样的观点。
  • 您应该首先以 sscanf 手册页中的代码为例。
  • 查找 realloc()。您希望从分配 1 开始,然后在每个字节进入时重新分配到 2、3、4 .. 等。(还有其他优化,但这是一个开始)。
  • getchar() 返回int 类型的值。永远不要使用char 来存储getchar() 的返回值。

标签: c memory-management


【解决方案1】:

一次读取整个输入通常是错误的。

标准方法是获取几千字节的缓冲区,并以该大小的块的形式读取和处理数据,覆盖以前读取的数据,这些数据现在无用。

在极少数情况下,您需要将整个内容放在 ram 中并从常规文件中读取,您可以 fstat 文件以获取其大小并进行相应的分配。如果文件很大(兆字节大小),您应该使用 mmap。

最后,在极少数情况下,您需要阅读资料并且无法提前知道大小,方法是每次重新分配 加倍 大小。即大小 *= 2;新 = realloc(p, 大小); p = 新的; ....

【讨论】:

  • 在最后一种情况下,我推荐newsize = 3 * oldsize / 2 + 10; 而不是你的newsize = 2 * oldsize;
  • 是的,方法在一定程度上有所不同,必须根据手头的情况进行调整。要点虽然大多数时候你不想预先读取数据,但如果你这样做,你想重新分配大跳跃
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2018-08-23
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多