错误使用memcpy连接字节块中的字节

时间:2010-07-01 17:00:43

标签: c malloc char byte memcpy

有时,以下代码有效,这可能意味着良好的概念,但执行不力。由于这种情况会根据位数的下降而崩溃,这意味着我正在沿途徘徊。我有兴趣找到一种优雅的方法来填充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);

2 个答案:

答案 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没有超出内存的一些方法吗?这是代码中潜在弱点的另一个方面。