使用typedef和Structures理解C代码

时间:2013-12-09 03:12:43

标签: c arrays struct typedef

以下是我试图理解的.c文件的相关摘要:

在阅读代码段之前的背景知识:

一旦获得数据包,线程正在侦听套接字。它读取数据(这是命令的名称),并根据数据(命令)采取行动。

#define HANDLER(cmd) {#cmd, cmd} 

handler_t table[] = {
    HANDLER(LOAD),
    HANDLER(STORE),
    HANDLER(REMOVE),
};

typedef struct _handler_t
{
    char cmd[CMD_LEN];
    void (*handler)(int argc, char *argv[], int sockfd);
} handler_t;


for (i = 0; i < sizeof(table) / sizeof(handler_t); i++)
    if (strcmp(cmd, table[i].cmd) == 0)  // where cmd is an array whose content were read from socket
        table[i].handler(argc, argv, sockfd);

为什么sizeof(table) / sizeof(handler_t)

为什么table[i].handler(argc, argv, sockfd);

3 个答案:

答案 0 :(得分:2)

tablehandler_t的数组,sizeof(table)是整个数组的大小,sizeof(handler_t)是一个元素的大小。所以sizeof(table) / sizeof(handler_t)是数组元素的数量。另一种更常见的方法是sizeof(table) / sizeof(table[0])

handler是一个函数指针,因此table[i].handler(argc, argv, sockfd);调用函数指针指向的函数。

答案 1 :(得分:1)

sizeof(table)/sizeof(handler_t)sizeof(table)是“表”的大小,以位为单位,因此该表是handler_t的数组,sizeof(table) / sizeof(handler_t)给出了元素的数量这个表,因而是索引的最大值。

table[i].handler(argc, argv, sockfd):这是对函数的调用,正如您所看到的,handler是一个以argcargvsockfd为参数的函数。

答案 2 :(得分:0)

sizeof(table) / sizeof(handler_t) // gives number of elements in the array 'table'