0
typedef struct testMsg_ {
    unsigned char opCode;
    unsigned int  Count;
    char    *macsStrList[MAC_ADDR_STR_LEN];
} testMsg_t;

macsStrList の要素数は m_Count です。

私は以下が正しくないことを知っています:

testMsg_t *pInput = (testMsg_t *) malloc(sizeof(testMsg_t) );
4

3 に答える 3

3

あなたが行った構造を考えると、これ正しいです

testMsg_t * pInput =(testMsg_t *)malloc(sizeof(testMsg_t));

*arr[dimension]ただし、おそらく、文字へのポインタの配列の長さの次元である-行間を読み取る-の意味に混乱しているでしょう。

MAC_ADDR_STR_LEN

おそらくMacアドレスの文字列表現の長さ(たとえば<20バイト?)

ただし、構造体は20個のcharポインターを提供し、有効なメモリーを指すように文字ポインターを初期化する必要があります。

testMsg_t *pInput = (testMsg_t *) malloc(sizeof(testMsg_t) );
pInput->macsStrList[0] = (char *) malloc( MAC_ADDR_STR_LEN+1 );
pInput->macsStrList[1] = (char *) malloc( MAC_ADDR_STR_LEN+1 );
pInput->macsStrList[2] = (char *) malloc( MAC_ADDR_STR_LEN+1 );
...

または構造体を再定義して

typedef struct testMsg_ {
    unsigned char opCode;
    unsigned int  Count;
    char    macsStrList[NUMBER_OF_MAC_ADDRESSES][MAC_ADDR_STR_LEN];
} testMsg_t;

複数の割り当てを処理する必要がないようにするため。

追加;

コメントによると、MACアドレスの数は動的に決定されるため、構造体を次のように定義することもできます。

typedef struct testMsg_ {
        unsigned char opCode;
        unsigned int  Count;
        char    macsStrList[1][MAC_ADDR_STR_LEN];
    } testMsg_t;

次に、を使用して割り当てます

testMsg_t *pInput = (testMsg_t *) malloc(sizeof(testMsg_t) + (countOfMacsAddresses * MAC_ADDR_STR_LEN) );

reallocこれにより、必要に応じて配列のサイズを動的に変更するために使用できるポインターを使用したソリューションが追加されます。

于 2012-07-12T14:51:12.723 に答える
1

あなたが探しているのはおそらく次のようなものだと思います(わかりました、Sorenが最初に参加しましたが、単一の連続したチャンクを割り当てる方法を示します):

/* assuming we only need macStrList[0] ... [Count-1] */
struct testMsg
{
    unsigned char opCode;
    unsigned int  Count;
    char *macsStrList[];
};

struct testMsg *allocate_testMsg(int count)
{
    char *string_storage;
    struct testMsg *msg;

    size_t size = sizeof(struct testMsg)   /* base object */
                + (count * sizeof(char *)) /* char* array */
                + (count * (MAC_ADDR_STR_LEN+1)) /* char storage */
                ;

    msg = malloc(size);
    msg->Count = count;
    string_storage = (char *)&(msg->macStrList[count]);

    /* note msg->macStrList points to UNINITIALIZED but allocated storage.
       it might be sensible to zero-fill string_storage, depending on how you'll
       initialize it
    */
    for (count=0; count < msg->Count;
         ++count, string_storage += (MAC_ADDR_STR_LEN+1))
    {
        msg->macStrList[count] = string_storage;
    }

    return msg;
}
于 2012-07-12T15:01:13.103 に答える
0

もちろん。testMsg_tのエイリアスであるへのポインタを割り当てますstruct testMsg_。ただし、このオブジェクトを自分で初期化する必要があります。

(そして、C で割り当てられたポインターをキャストする必要はありません)。

于 2012-07-12T14:45:56.760 に答える