У меня есть структура данных, которая содержит размер данных и сами данные, и у меня также есть две функции, которые сериализуют десериализацию той же структуры.
Обратите внимание, что эти функции сериализации не совсем практичны или эффективны.
Моя data_t
структура:
struct data_t {
int datasize;
void *data;
};
Моя функция data_To_buffer
, которая преобразует структуру в буфер:
int data_to_buffer(struct data_t *data, char **data_buf) {
if (data == NULL || data_buf == NULL)
return -1;
int buf_size = INT_S + data -> datasize;
*data_buf = malloc(buf_size);
char *buf_ptr = *data_buf;
int int_v = htonl(data -> datasize);
memcpy(buf_ptr, &int_v, INT_S);
buf_ptr += INT_S;
memcpy(buf_ptr, data -> data, data -> datasize);
return buf_size;
}
Моя функция buffer_to_data
, котораяпреобразует буфер в объект data_t.
struct data_t *buffer_to_data(char *data_buf, int data_buf_size) {
if(data_buf == NULL || data_buf_size <= 0)
return NULL;
int size = ntohl(* (int *) data_buf);
data_buf += INT_S;
struct data_t *data = data_create(size);
memcpy(data -> data, data_buf, data -> datasize);
printf("\n SIZE: %d", data -> datasize); <- OK = 14
printf("\n Data: %s\n", data -> data); <- OK = 1234567890abc
return data;
}
Проблема
В моем main
при тестировании этих функций возникает ошибка при попытке печатизначение десериализованных данных.
Обратите внимание, что когда я печатаю data
и datasize
в функции buffer_to_data
, проблем вообще не возникает, только после возврата данных возникает ошибка.
int main() {
int data_size;
struct data_t *data, *data2;
char *data_s = strdup("1234567890abc");
char *data_buf;
data_size = strlen(data_s)+1;
data = data_create2(data_size, data_s); <- OK
int buf_size = data_to_buffer(data, &data_buf); <- OK
data2 = buffer_to_data(data_buf, buf_size);
printf("\n DATA2 SIZE: %d", data2 -> datasize); <- SEGMENTATION FAULT
printf("\n DATA2 Data: %s\n", data2 -> data);
...
}