C - Сериализация struct в char * меняет исходные данные - PullRequest
0 голосов
/ 09 декабря 2018

После этого вопроса я решил сериализовать некоторые данные, которые мне нужно отправить через соединение 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 голосов
/ 09 декабря 2018

У вас есть char** packet, который является указателем на указатель на некоторые символы.

Затем вы воспринимаете это как int *, который является указателем на некоторые целые числа.

Затем вы перезаписываетепервый int - так что вы пишете в «dest», а не на то, на что он указывает.И поскольку после этого вы пишете больше, вы портите стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...