在遇到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
之前,数据都是正确的。
有人有没有遇到过这样的问题?
答案 0 :(得分:3)
您有char** packet
,它是指向某些字符的指针。
然后将其视为int *
,它是指向某些整数的指针。
然后,您覆盖第一个int
-因此,您正在写入“目标”本身,而不是其指向的内容。而且由于在此之后编写了更多内容,因此破坏了堆栈。