【发布时间】:2020-02-09 19:40:23
【问题描述】:
我有一个包含数据大小和数据本身的数据结构,我还有两个函数可以序列化和反序列化相同的结构。
请注意,这些序列化函数并不完全实用或有效。
我的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 测试这些函数时,当我尝试打印反序列化数据的值时出现错误。
请注意,当我在buffer_to_data函数中打印data和datasize时完全没有问题,只有在我返回数据后才会出现错误。
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);
...
}
【问题讨论】:
-
您能创建一个minimal reproducible example 吗?这应该是一个完整的程序,有人可以逐字编译和运行,而不必猜测如何填写缺失的部分。特别是包含
data_create2的代码,这样我们就可以看到数据对象是如何构造的。
标签: c pointers struct segmentation-fault