1

有时,下面的代码会起作用,这可能意味着概念很好,但执行很差。由于这取决于钻头掉落的位置而崩溃,这意味着我正在一路杀戮。我有兴趣找到一种优雅的方式来填充bufferdata<=4096 字节buffer,但不可否认,这不是它。

编辑:我收到的错误是对缓冲区数据的非法访问

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);
4

2 回答 2

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);
      }
      ... 
    }
于 2010-07-01T17:19:34.423 回答
0

几点评论:

请定义或 const 4096。如果您需要更改它,您将被烧毁。realloc 链接是一种非常低效的获取缓冲区的方法。有什么方法可以预取大小并立即获取所有内容?也许不是,但是当我看到 realloc() 时我总是畏缩。我还想知道 kZipBufferSize 是什么,以及它是否像您的其他计数一样以字节为单位。另外,bufferdatawrite到底是什么?我假设它是源数据,但我希望看到它的声明以确保它不是内存对齐问题 - 这有点像这种感觉。或者由于大小错误导致缓冲区溢出。

最后,您确定他们的 nextBlock 不会以某种方式超出内存吗?这是代码中的另一个潜在弱点。

于 2010-07-01T17:17:45.873 回答