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