在不使用malloc的情况下,是否可以增加char数组?
我有一个字符数组,我们知道字符大小是1字节。当然,现在我必须收集一些char->getchar(),同时将数组增加1字节(没有malloc,只有库:stdio.h) 我的建议是,指向数组,以某种方式将数组增加1,直到没有更多的字符,或者内存不足 在不使用malloc的情况下,是否可以增加char数组 没有 不能增加固定大小数组的大小 为此,您需要使用在不使用malloc的情况下,是否可以增加char数组?,c,arrays,pointers,char,C,Arrays,Pointers,Char,我有一个字符数组,我们知道字符大小是1字节。当然,现在我必须收集一些char->getchar(),同时将数组增加1字节(没有malloc,只有库:stdio.h) 我的建议是,指向数组,以某种方式将数组增加1,直到没有更多的字符,或者内存不足 在不使用malloc的情况下,是否可以增加char数组 没有 不能增加固定大小数组的大小 为此,您需要使用,而这似乎是“不允许”使用的 是否可以在使用时增加char数组,而不使用malloc 快速回答:否不重新分配阵列,就不可能增加阵列的大小 有趣的回答
,而这似乎是“不允许”使用的
是否可以在使用时增加char
数组,而不使用malloc
快速回答:否不重新分配阵列,就不可能增加阵列的大小
有趣的回答:不要使用malloc()
,使用realloc()
长答案:
如果char
数组具有静态或自动存储类,则很可能无法在运行时增加其大小,因为将其保持在相同的地址,这将需要将位于较高地址的对象移动或重新分配到其他位置
如果数组是通过malloc
获得的,那么如果在内存中没有分配其他对象,则可能会扩展其大小。实际上,realloc()
的大小越大,可能返回相同的地址。问题是无法预测,如果realloc
返回不同的地址,则当前空间已被释放,因此指向它的指针现在无效
进行这种重新分配的有效方法是以几何方式增加大小,每次增加一个系数,2x、1.5x、1.625x。。。当阵列的大小线性增长时,最小化重新分配的次数并保持线性时间。对于数组的分配大小和存储在其中的字符数,您可能需要使用不同的变量
以下是一个例子:
#包括
#包括
内部主(空){
char*a=NULL;
大小\u t大小=0;
大小\u t计数=0;
INTC;
而((c=getchar())!=EOF&&c!='\n'){
如果(计数>=大小){
/*将缓冲区重新分配到1.5倍大小*/
大小=大小+大小/2+16;
char*new_a=realloc(a,新_大小);
if(new_a==NULL){
fprintf(“内存不足%zu字节”,新的\u大小);
免费(a);
返回1;
}
a=新的_a;
尺寸=新尺寸;
}
a[count++]=c;
}
对于(i=0;i 有两种方法可以在不使用动态内存分配(malloc…)的情况下为字符串创建空间。您可以使用静态阵列或具有自动存储持续时间的阵列,您需要指定最大数量,您可能永远无法达到。但要经常检查
#define BUFFER_SIZE 0x10000
静止的
static char buffer[BUFFER_SIZE];
或自动(您需要确保缓冲区大小小于堆栈大小)
操作系统也进行了一些优化。它可能会惰性地分配整个(静态/自动)缓冲区,以便只有使用的部分在物理内存中。(这也适用于动态内存分配函数。)我发现calloc(用于大块)只是为程序分配虚拟内存;内存页只有在被访问时才被清除(可能是通过cpu引发的一些中断)。我将其与malloc和memset的分配进行了比较。如果程序没有访问缓冲区的所有字节/页,则memset不需要工作
如果无法使用malloc…分配缓冲区,请创建一个具有足够大小的静态/自动数组,并让操作系统为您分配。它不会占用二进制文件中的相同空间,因为它只是作为大小存储的
int main() {
char buffer[BUFFER_SIZE];
...
};