【问题标题】:Segmentation fault when accessing returned pointer访问返回的指针时出现分段错误
【发布时间】: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函数中打印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: %s\n", data2 -> data);

    ...
}

【问题讨论】:

  • 您能创建一个minimal reproducible example 吗?这应该是一个完整的程序,有人可以逐字编译和运行,而不必猜测如何填写缺失的部分。特别是包含data_create2的代码,这样我们就可以看到数据对象是如何构造的。

标签: c pointers struct segmentation-fault


【解决方案1】:

这里:

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);

【讨论】:

  • 不起作用,核心在第一次更改时就被转储了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多