C语言 访问返回的指针时出现分段错误



我有一个包含数据大小和数据本身的数据结构,我还有两个函数来序列化反序列化相同的结构。

请注意,这些序列化函数并不完全实用或有效。

我的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: %sn", data -> data); <- OK = 1234567890abc
return data;
}

问题所在

在我测试这些功能时main,当我尝试打印反序列化数据的值时出现错误。

请注意,当我在buffer_to_data函数中打印datadatasize时,根本没有问题,只有在我返回数据后才会发生错误。

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: %sn", data2 -> data);
...
}

在这里:

memcpy(buf_ptr, &int_v, INT_S);

您缺少对内部缓冲区的取消引用,而是覆盖传递的指针

固定电话:

memcpy(*buf_ptr, &int_v, INT_S);

同样的错误在这里:

buf_ptr += INT_S;
memcpy(buf_ptr, data -> data, data -> datasize);

固定变体:

memcpy(*buf_ptr + INT_S, data -> data, data -> datasize);

相关内容

  • 没有找到相关文章

最新更新