2

私のソース ファイルには、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

それで、私は何を間違っていますか?

4

3 に答える 3

4

問題は、配列へのポインターがポインターへのポインターと互換性がないことです。それらは異なるものです。これは、コード内のようなエラーをキャッチすることを目的としているため、これも良いことです。あなたがやっていることは基本的にこれです:

unsigned char szrecordid[28];
szrecordid = malloc(i * sizeof **value);

問題を確認できるはずです。配列にポインターを割り当てようとしています。

于 2013-06-30T17:26:07.907 に答える
1

私の理解が正しければ、問題は szrecordid のアドレスを変更できないことです:

typedef struct _MY_STRUCT_TYPE {
    unsigned char   szrecordid[28];
}

この変数のアドレスを変更できない場合は、それが配列であるためです。代わりに char * を使用するか、malloc を使用せずに代わりに使用してくださいstrcpy

ところで、ご利用strcpystrdup際は是非ご検討ください。基本的に、関数は次のことを行っています。

strcpy(val, buffer);
printf("\n chararr: %s :", val);
*value = strdup(buffer);
printf("%s", value);

また、最初の strcpy も役に立たないことに気付くかもしれません。この中間文字配列の意味がわかりません。

于 2013-06-30T17:27:07.477 に答える