zlib deflate и динамический буфер вывода

Хорошо, я немного переделал свой вопрос, я не понимаю, как правильно выкачать содержимое в буфер 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, еще указывает на начало данных? Так что, в основном, если я использую несколько перераспределений, конечные данные нарушаются. Конец: Как правильно определить, сколько данных мне нужно выделить для моего выходного буфера дефляции, и правильно ли использовать буфер динамического перераспределения в z_stream?

0

Решение

realloc обеспечивает копирование данных в новое место, когда новый размер не помещается в старое место в памяти. calloc просто обнуляет выделенную память и не копирует старые данные. Поэтому вы должны передать большие значения calloc, Вам, вероятно, нужен только один звонок calloc когда вы передаете это, что большие числа, тогда как realloc может принимать меньшие приращения. Есть смысл?

ура

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector