好的,我重新提出了我的问题,我不明白如何正确地将内容放入DYNAMIC缓冲区,后者需要不断重新分配。我重新编写了一些代码,只有在没有重新分配缓冲区的情况下它才会起作用,所以在少量数据上,重新分配以某种方式中断输出流。
void test_deflate_dynamic(char*str)
{
if(store == NULL) // first call to the function allocate some memory etc
{
gzip_stream.zalloc = Z_NULL;
gzip_stream.zfree = Z_NULL;
gzip_stream.opaque = Z_NULL;
result = deflateInit(&gzip_stream,9);
if(result!=Z_OK) { printf("bad\r\n"); exit(0); }
total_buf_size =deflateBound(&gzip_stream,strlen(str));
printf("d_bound_init=%d\r\n",total_buf_size);
store = realloc(store,total_buf_size); // first allocation
gzip_stream.avail_out = total_buf_size;
gzip_stream.next_out = store;
gzip_stream.avail_in = strlen(str)+1;
gzip_stream.next_in = str;
result = deflate(&gzip_stream,Z_NO_FLUSH);
}
else
{
gzip_stream.avail_in = strlen(str)+1;
gzip_stream.next_in = str;
int t_size;
printf ("avail_out=%d\r\n",gzip_stream.avail_out);
t_size = deflateBound(&gzip_stream,strlen(str));
printf("d_bound=%d\r\n",t_size);
total_buf_size += t_size;
gzip_stream.avail_out = total_buf_size;
store = realloc(store,total_buf_size);
gzip_stream.next_out = store;
result = deflate(&gzip_stream,Z_NO_FLUSH);
}
}
正如您所看到的,我正在使用函数deflateBound
来检测我需要分配多少数据,所以首先,使用deflateBound是否正确?第二,是由realloc
修改然后重新分配给z_stream
的指针仍然指向数据的开头?所以基本上如果我使用多次重新分配,最终数据就会被破坏。结束:我如何正确检测,我需要为输出deflate缓冲区分配多少数据,在z_stream中使用动态重新分配缓冲区是否正确?
答案 0 :(得分:0)
realloc
可确保在新尺寸不适合旧内存位置时将数据复制到新位置。 calloc
只是将分配的内存归零,并且不会复制旧数据。因此,您必须将更大的值传递给calloc
。当您传递大数字时,您可能只需要一次调用calloc
,而realloc
可以接受较小的增量。有意义吗?
干杯