C-将结构序列化为char *会更改原始数据

时间:2018-12-09 00:50:36

标签: c serialization struct

在遇到this问题之后,我决定对需要通过TCP / IP连接发送的一些数据进行序列化。

数据非常简单:

typedef struct whiteboard {
    int palladium, platine, zirconium, erbium, astate, californium;
} sharedData;

我的序列化功能也非常简单:

void serializeWhiteboard (sharedData* message, char** packet) {
    int* r = (int*) packet;
    *r = (int)VALUE_FROM_ENUM; // just some enum to get the type of message sent
    r++;
    char* q = (char*) r;
    *q = '/'; q++; // delimitors for parsing
    *q = '/'; q++; // the message on the other end
    int* p = (int*) q;
    *p = message->palladium;    p++;
    *p = message->platine;      p++;
    *p = message->zirconium;    p++;
    *p = message->erbium;       p++;
    *p = message->astate;       p++;
    *p = message->californium;  p++;
    return;
}

在我的调用程序中,我有以下代码:

int main() {
    sharedData data = {0};
    // define the data values ...
    char* dest = malloc(sizeof(int) + 2*sizeof(char) + 6*sizeof(int));
    serialiseWhiteboard(&data, &dest);
    // And here, the first two fields of 'data' have changed
    // as if by magic, since I do not touch the fields in 
    // serializeWhiteboard() .
    return 0;
 }

我一生都无法弄清楚为什么当我从数据中读取值时,数据的前两个字段会发生变化。但是,有了一些打印值,我就可以将其跟踪到serializeWhiteboard()的倒数第二行,就在return;之前,这没有任何意义。直到调用return之前,数据都是正确的。

有人有没有遇到过这样的问题?

1 个答案:

答案 0 :(得分:3)

您有char** packet,它是指向某些字符的指针。

然后将其视为int *,它是指向某些整数的指针。

然后,您覆盖第一个int-因此,您正在写入“目标”本身,而不是其指向的内容。而且由于在此之后编写了更多内容,因此破坏了堆栈。