【发布时间】:2018-12-19 09:11:29
【问题描述】:
我知道 C 中有一个通用策略来处理输入数据(例如文本)超出原始分配空间的情况。这是重新分配更多空间。
#include <stdlib.h>
#include <stdio.h>
#define BUF_SIZE 1024
void check_buffer(char *buffer)
{
if (!buffer) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
}
char *read_line()
{
int bufsize = BUF_SIZE;
int position = 0;
char *buffer = malloc(sizeof(char) * bufsize);
int c;
check_buffer(buffer);
while (1) {
c = getchar();
if (c == EOF || c == '\n') {
buffer[position] = '\0';
return buffer;
} else {
buffer[position] = c;
}
position++;
if (position >= bufsize) {
bufsize += BUF_SIZE; // Or `bufsize *= 2;`?
buffer = realloc(buffer, bufsize);
check_buffer(buffer);
}
}
}
那么扩大原始空间的更好方法是什么? bufsize += BUF_SIZE 还是 bufsize *= 2?哪种方式更有效?
【问题讨论】:
-
我只做
bufsize += 1。这取决于。关于系统、环境、使用、程序、开发人员。许多图书馆以不同的方式处理这个问题,例如。见cs50。前任。在 C++ 中,他们只是new bufsize+1-> 复制所有数据 ->delete old_storage。 -
不要
realloc使用指针本身,使用临时指针,例如void *tmp = realloc(buffer, bufsize * 2); if (!tmp) { perror ("realloc-buffer"); buffer[position] = '\0'; break; } buffer = tmp; bufsize *= 2;继续前进。
标签: c allocation