有时,以下代码有效,这可能意味着良好的概念,但执行不力。由于这种情况会根据位数的下降而崩溃,这意味着我正在沿途徘徊。我有兴趣找到一种优雅的方法来填充bufferdata
来自buffer
的< = 4096字节,但不可否认,这不是它。
编辑:我收到的错误是对bufferdata的非法访问
unsigned char buffer[4096] = {0};
char *bufferdata;
bufferdata = (char*)malloc(4096 * sizeof(*bufferdata));
if (! bufferdata)
return false;
while( ... )
{
// int nextBlock( voidp _buffer, unsigned _length );
read=nextBlock( buffer, 4096);
if( read > 0 )
{
memcpy(bufferdata+bufferdatawrite,buffer,read);
if(read == 4096) {
// let's go for another chunk
bufferdata = (char*)realloc(bufferdata, ( bufferdatawrite + ( 4096 * sizeof(*bufferdata)) ) );
if (! bufferdata) {
printf("failed to realloc\n");
return false;
}
}
}
else if( read<0 )
{
printf("error.\n");
break;
}
else {
printf("done.\n");
break;
}
}
free(bufferdata);
答案 0 :(得分:4)
很难说出错误在哪里,这里和那里都缺少一些代码。
if(read == 4096) {
看起来像是罪魁祸首,如果是nextBlock,一次迭代返回4000,下一次返回97?现在你需要存储4097个字节,但是你不需要重新分配缓冲区以适应它。
您需要累积字节,并在每次传递4096边界时重新分配。 类似的东西:
#define CHUNK_SIZE 4096
int total_read = 0;
int buffer_size = CHUNK_SIZE ;
char *bufferdata = malloc(CHUNK_SIZE );
char buffer[CHUNK_SIZE];
while( ... )
{
// int nextBlock( voidp _buffer, unsigned _length );
read=nextBlock( buffer, CHUNK_SIZE );
if( read > 0 )
{
total_read += read;
if(buffer_size < total_read) {
// let's go for another chunk
char *tmp_buf;
tmp_buf= (char*)realloc(bufferdata, buffer_size + CHUNK_SIZE );
if (! tmp_buf) {
free(bufferdata);
printf("failed to realloc\n");
return false;
}
buffer_data = tmp_buf;
buffer_size += CHUNK_SIZE ;
}
memcpy(bufferdata+total_read-read,buffer,read);
}
...
}
答案 1 :(得分:0)
一些评论:
请定义或const 4096.如果您需要更改它,您将被烧毁。 realloc链接是获取缓冲区的一种非常低效的方法。你有什么方法可以预取大小并一次抓住它吗?也许不是,但是当我看到realloc()时,我总是畏缩。我还想知道kZipBufferSize是什么,以及它是否像其他数字一样以字节为单位。另外,bufferdatawrite究竟是什么?我假设它的源数据,但我希望看到它的声明,以确保它不是一个内存对齐问题 - 这有点像这样的感觉。或者由于尺寸不合适而导致缓冲区溢出。
最后,你确定他们的nextBlock没有超出内存的一些方法吗?这是代码中潜在弱点的另一个方面。