私のソース ファイルには、C ソケットを介して渡された構造体を逆シリアル化するプロセスで呼び出す関数があります (これはクライアント ソースです)。
MY_STRUCT_TYPE myStructVar;
unsigned char * deserialize_chararr(unsigned char *buffer, unsigned char** value)
{
unsigned char val[256];
int i;
for(i = 0; buffer[i]; i++) {
val[i] = buffer[i];
}
val[i++] = '\0';
printf("\n chararr: %s :", val);
*value = malloc(i * sizeof **value);
for(i = 0; buffer[i]; i++) {
(*value)[i] = buffer[i];
printf("%c", (*value)[i]);
}
(*value)[i++] = '\0';
/* buffer contains a serialized struct read over a socket using recv.
so this call returns the buffer pointer that get's passed to the next deserialize_<type> invocation a la https://stackoverflow.com/a/1577174/434145
That's why the first string extraction followed by an attempt to set it in the struct as part of unpacking. */
return buffer + i;
}
私が呼んでいること
buffer = deserialize_chararr(buffer, &myStructVar->szrecordid);
どこ
typedef struct _MY_STRUCT_TYPE {
unsigned char szrecordid[28];
}
サーバーはデータを問題なく送信し、上記の関数で正しく解析しますが、構造体の String 変数に設定できないようです。これを見た後、関数を char ** param を使用するように変更しましたが、印刷するとゴミが発生します
printf("\n Payload:" "\n szrecordid: %s ", myStructVar.szrecordid);
要するに、文字列へのポインターを渡し (&myStructVar->szrecordid)、malloc を使用して、ポインター文字を文字で割り当てます (この後半部分はリンクから取得しました)。コードを char * の使用から char ** の使用に変更する前後の両方で、同じエラーとコンパイラの警告が表示されました。
client.c:159: warning: passing arg 2 of `deserialize_chararr' from incompatible pointer type
それで、私は何を間違っていますか?