在不使用malloc的情况下使用它可以增加char数组吗?

时间:2019-04-07 11:42:24

标签: c arrays pointers char

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

我的建议是,指向该数组,然后以某种方式将该数组增加1,直到没有更多的字符可以获取,否则就会耗尽内存...

3 个答案:

答案 0 :(得分:3)

  

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

否。

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

为此,您需要<stdlib.h>中的realloc(),看来您没有被“允许”使用。

答案 1 :(得分:2)

  

使用char时是否可以增加malloc数组而无需使用malloc()

快速解答:不,不重新分配数组就不可能增加数组的大小。

有趣的答案:请勿使用realloc(),而使用char

长答案:

如果malloc数组具有静态或自动存储类,则很可能无法在运行时增加其大小,因为将其保持在相同的地址上将需要移动位于较高地址的对象,或者重新分配到其他地方。

如果数组是通过realloc()获得的,则在内存中没有分配其他对象的情况下,有可能扩展其大小。实际上,realloc可能会返回相同的地址。问题是无法预测,如果#include <stdio.h> #include <stdlib.h> int main(void) { char *a = NULL; size_t size = 0; size_t count = 0; int c; while ((c = getchar()) != EOF && c != '\n') { if (count >= size) { /* reallocate the buffer to 1.5x size */ size_t newsize = size + size / 2 + 16; char *new_a = realloc(a, new_size); if (new_a == NULL) { fprintf("out of memory for %zu bytes\n", new_size); free(a); return 1; } a = new_a; size = new_size; } a[count++] = c; } for (i = 0; i < count; i++) { putchar(a[i]); } free(a); return 0; } 返回不同的地址,则当前空间已被释放,因此指向它的指针现在无效。

进行此重新分配的有效方法是将几何尺寸一次增大2倍,1.5倍,1.625倍...以最大程度地减少重新分配的数量并将线性时间保持为数组线性增长。您将为分配的数组大小和存储在其中的字符数使用不同的变量。

这里是一个例子:

I was trying to download the highcharts.js line graph in the black and white image during downloading in spite of the colors which are randomly generated in the graph. But I am not getting how can I achieve this. 

答案 2 :(得分:0)

有两种方法可以在不使用动态内存分配(malloc ...)的情况下为字符串创建空间。您可以使用静态数组或具有自动存储持续时间的数组,您需要指定一个最大数量,您可能永远无法达到。但请始终对此进行检查。

#define BUFFER_SIZE 0x10000

静态

static char buffer[BUFFER_SIZE];

还是自动的(您需要确保BUFFER_SIZE小于堆栈的大小)

int main() {
    char buffer[BUFFER_SIZE];
    ...
};

操作系统还进行了一些优化。它可能会延迟分配整个(静态/自动)缓冲区,以便只有用过的部分在物理内存中。 (这也适用于动态内存分配功能。)我发现calloc(用于大块)只是为程序分配虚拟内存;仅在访问内存页时才清除内存页(可能通过cpu引发的某些中断)。我将其与具有malloc和memset的分配进行了比较。如果不是程序访问缓冲区的所有字节/页,则memset都会执行不必​​要的工作。

如果无法使用malloc ...分配缓冲区,请创建一个具有足够大小的静态/自动数组,并让操作系统为您分配它。二进制,因为它只是存储为大小。