gpt4 book ai didi

c - 使用 memcpy 连接字节 block 中的字节时出错

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:22 25 4
gpt4 key购买 nike

有时,以下代码可以工作,这可能意味着概念不错,但执行不佳。由于这取决于钻头掉落的位置,这意味着我正在沿途屠杀一步。我有兴趣找到一种优雅的方法来用 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);

最佳答案

很难说出错误在哪里,这里那里缺少一些代码。

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

关于c - 使用 memcpy 连接字节 block 中的字节时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com