массив структур - размер возвращаемого неожиданного результата - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть массив простых структур, объявленных в моем коде. sizeof() возвращается ответ, который не соответствует размеру массива. Есть ли другой способ объявить это, чтобы обеспечить правильный размер ответа?

struct control_cmd {
    const char * cmd;
    void (*cmd_fn)(int,char *(*)[],char*);
};

struct control_cmd control_cmds[]={
    {"ANNOUNCE",control_announce},
    {"SEND",control_send}
};

sizeof(control_cmds) возвращает значение 16, когда я ожидаю значение 2.

Что происходит?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Я бы набралdef control_cmd_t, объявил бы control_cmds как массив control_cmd_t и разделил бы их. (Очень похоже на ответ Арку).

#include <stdio.h>

typedef struct control_cmd_t__ {
    const char * cmd;
    void (*cmd_fn)(int,char *(*)[],char*);
} control_cmd_t;

control_cmd_t control_cmds[]={
    {"ANNOUNCE",control_announce},
    {"SEND",control_send}
};

int main()
{
    printf("sizeof control_cmd_t is: %ld\n", sizeof(control_cmd_t));
    printf("sizeof control_cmds is: %ld\n", sizeof(control_cmds));
    printf("number of elements in control_cmds is: %d", (sizeof(control_cmds)/sizeof(control_cmd_t)));

    return 0;
}

Выход:

sizeof control_cmd_t is: 16
sizeof control_cmds is: 32
number of elements in control_cmds is: 2
0 голосов
/ 01 сентября 2018

sizeof - это размер в памяти, а не количество элементов. В случае массива (не указателя!) Вы можете получить количество элементов, разделив размер массива на размер отдельного элемента, то есть sizeof(control_cmds) / sizeof(*control_cmds).

...