Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 渐进式内存分配策略_C_Memory Management - Fatal编程技术网

C 渐进式内存分配策略

C 渐进式内存分配策略,c,memory-management,C,Memory Management,出于教学目的,我正在编写一个从标准输入中读取字符串(字符数组)的程序。目标是允许程序按照输入的维度顺序增加分配的内存。我想听听你对我的方法的意见 我想我可以为每一个需要的阅读周期一个接一个地分配一个字节的空间。显然,这是行不通的。我如何处理这个问题?值得一试吗 感谢您的耐心和支持 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(){ char *q;

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

我想我可以为每一个需要的阅读周期一个接一个地分配一个字节的空间。显然,这是行不通的。我如何处理这个问题?值得一试吗

感谢您的耐心和支持

#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;
}
#包括
#包括
#包括
int main(){
char*q;
int标志=1,j=0;
printf(“\n\n现在让我们找一个未定义长度的单词。键入:\n\n”);
做{
q++=calloc(1,sizeof(char));
flag=((q[j]=getchar())!=0);#直到它有效。
++j;
}而(旗),;
返回0;
}

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

标准的方法是获得一个几千字节的缓冲区,并以这种大小的数据块读取和处理数据,覆盖以前读取的数据,而现在这些数据已经无用了

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


最后,在极为罕见的情况下,如果你需要阅读材料,而你无法事先知道尺寸,那么方法就是每次将尺寸加倍。i、 e.尺寸*=2;新=realloc(p,尺寸);p=新

首先,阅读
getchar()
的文档。完成后,它返回
EOF
,而不是零。第二个
q++=calloc(1,sizeof(char)
不会增加缓冲区。它分配(并泄漏)一个缓冲区,然后增加
calloc()的指针
返回。谢谢@Peter,这是一个非常有价值的建议。我没有这样的想法。你应该以sscanf手册页上的代码为例开始。查找realloc()。你想从分配1开始,然后在每个字节进入时将realloc分配到2、3、4……等等。(还有其他优化,但这是一个开始).
getchar()
返回类型为
int
的值。切勿使用
char
存储
getchar()的返回值
。在最后一种情况下,我建议使用
newsize=3*oldsize/2+10;
而不是
newsize=2*oldsize;
是的,方法在一定程度上有所不同,必须根据手头的情况进行调整。虽然要点是,大多数时候你不想提前阅读数据,但如果你想阅读,你会想进行大幅度的重新分配