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 个字符指针,并且字符指针仍然必须初始化以指向有效内存。

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

当然是。您分配一个指向 a 的指针,testMsg_t它是 的别名struct testMsg_。但是,您需要自己初始化此对象。

(而且您不需要在 C 中强制转换分配的指针)。

于 2012-07-12T14:45:56.760 回答