Хорошо, я немного переделал свой вопрос, я не понимаю, как правильно дефлировать содержимое в буфер 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?
realloc
гарантирует, что данные будут скопированы в новое место, когда новый размер не поместится в старую ячейку памяти. calloc
просто нули выделенной памяти и не копирует старые данные. Поэтому вы должны передавать большие значения calloc
. Вероятно, вам нужен только один вызов calloc
когда вы передаете ему большие числа, тогда как realloc
может принимать меньшие приращения. Имеют смысл?
ура
test_deflate_dynamic()
и что вы делаете с данными, которые он выдает. Поэтому вы должны опубликовать полную программу.