【发布时间】:2016-01-08 17:51:07
【问题描述】:
所以我试图一次从标准输入读取一个字节。 while 循环的每次迭代我都试图重新分配缓冲区,但我不想使用 realloc。这是我尝试过的:
char tempChar = '\0';
char *buffer;
int bufferSize = 0;
buffer = (char*) malloc(sizeof(char));
while((tempChar = getc(stdin)) != EOF)
{
buffer[bufferSize] = tempChar;
bufferSize++;
char *temp = buffer;
buffer = (char*)malloc(sizeof(char)*bufferSize);
memcpy(buffer, temp, sizeof(temp));
free(temp);
}
buffer[bufferSize] = '\0';
我遇到了分段错误。知道为什么会这样吗?
编辑:好的,我修复了其他人所说的两个错误。这是固定版本:
char tempChar = '\0';
char *buffer;
int bufferSize = 1;
int count = 0;
buffer = malloc(sizeof(char));
while((tempChar = getc(stdin)) != EOF){
buffer[count] = tempChar;
count++;
if(count >= bufferSize){
bufferSize *= 2;
char *temp = buffer;
buffer = malloc(sizeof(char)*bufferSize);
memcpy(buffer, temp, count);
free(temp);
}
}
buffer[count - 1] = '\0';
【问题讨论】:
-
你为什么不想使用
realloc? -
你差了一个 - 读完一个字符后,你创建了一个新的缓冲区 - 大小为 one。而你的
memcpy()是错误的。 -
仅从实际的角度来看,我想不出一种效率较低的内存分配方式。您至少应该分配一些合理的字节数,然后在每次需要时增加一些合理的数量。为什么不
32或64或256等... -
sizeof(temp)是一个常数;可能是 4 或 8 个。 -
@DavidC.Rankin:你从哪里得到这个数字 32?我希望
fgets几乎立即变得更快。fgets的开销不应大于 OP 的循环,并且每个字符的成本应该显着降低(每个字符 1 个循环与每个字符调用整个函数相比)。
标签: c memory-management segmentation-fault malloc