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
在不使用malloc的情况下,是否可以增加char数组?_C_Arrays_Pointers_Char - Fatal编程技术网

在不使用malloc的情况下,是否可以增加char数组?

在不使用malloc的情况下,是否可以增加char数组?,c,arrays,pointers,char,C,Arrays,Pointers,Char,我有一个字符数组,我们知道字符大小是1字节。当然,现在我必须收集一些char->getchar(),同时将数组增加1字节(没有malloc,只有库:stdio.h) 我的建议是,指向数组,以某种方式将数组增加1,直到没有更多的字符,或者内存不足 在不使用malloc的情况下,是否可以增加char数组 没有 不能增加固定大小数组的大小 为此,您需要使用,而这似乎是“不允许”使用的 是否可以在使用时增加char数组,而不使用malloc 快速回答:否不重新分配阵列,就不可能增加阵列的大小 有趣的回答

我有一个字符数组,我们知道字符大小是1字节。当然,现在我必须收集一些char->getchar(),同时将数组增加1字节(没有malloc,只有库:stdio.h)

我的建议是,指向数组,以某种方式将数组增加1,直到没有更多的字符,或者内存不足

在不使用malloc的情况下,是否可以增加char数组

没有

不能增加固定大小数组的大小

为此,您需要使用
,而这似乎是“不允许”使用的

是否可以在使用时增加
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];
    ...
};