【问题标题】:errors concatenating bytes from a block of bytes using memcpy使用 memcpy 连接字节块中的字节时出错
【发布时间】:2011-03-10 18:04:25
【问题描述】:

有时,以下代码会起作用,这可能意味着概念不错,但执行效果不佳。由于这取决于碎片掉落的位置而崩溃,这意味着我正在一路杀戮。我有兴趣找到一种优雅的方法来用来自buffer 的 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);

【问题讨论】:

  • 它是如何/在哪里失败的? bufferdatawrite 从何而来?这需要增加...

标签: c malloc char byte memcpy


【解决方案1】:

几个cmets:

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

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

【讨论】:

  • 是的,你是对的。我在这里将常量转换为幻数,仅用于说明目的。 (我已经从示例代码中编辑了这个)
【解决方案2】:

很难判断错误在哪里,这里和那里缺少一些代码。

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);
      }
      ... 
    }

【讨论】:

  • 您在 memcpy 之前增加了 total_read,这意味着您的 memcpy 会将 read 字节写入缓冲区太远。你需要memcpy(bufferdata+total_read-read, buffer, read)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多