struct数组中未定义的元素

Fis*_*uts 8 c arrays struct segmentation-fault

我正在创建一个客户端/服务器应用程序,并希望动态调用函数.我创建了以下结构:

typedef struct _cmd cmd;
struct _cmd
{
    const char *name;
    void (*func)(int s,int ac, char **av);
};
Run Code Online (Sandbox Code Playgroud)

当客户端向服务器发送命令时,服务器将浏览一系列命令:

cmd cmds[] = {
        { "CREATE", cmd_create },
        { "EXIT" ,  cmd_exit },
        { "LIST", cmd_list },
        { "READ", cmd_read },
        { "DELETE", cmd_delete },
        { "UPDATE", cmd_update }
};


cmd *find_cmd(const char *name) {
    cmd *c;
    for (c = cmds; c->name; c++) {
        if (stricmp(name, c->name) == 0)
            return c;
    }
    return NULL;
}    
Run Code Online (Sandbox Code Playgroud)

请不要那样

stricmp()
Run Code Online (Sandbox Code Playgroud)

不是拼写错误,它是strcmp的一个不区分大小写的版本.

我现在有以下问题.当我调用find_cmd()并传递无效的命令时,我的应用程序崩溃了.我的调试信息显示如下:

Browsing Command: CREATE
Browsing Command: EXIT
Browsing Command: LIST
Browsing Command: READ
Browsing Command: DELETE
Browsing Command: UPDATE
Browsing Command: ?p?
Browsing Command: ?(?
Run Code Online (Sandbox Code Playgroud)

之后我得到了段错误.这看起来好像在struct structm中有一些未定义的元素,但它们来自哪里?我在俯瞰什么?提前感谢任何指针.

Dox*_*ver 11

在列表的末尾需要一个"null"元素来触发for循环中的c->name(!= NULL)测试.

更改

cmd cmds[] = {
        { "CREATE", cmd_create },
        { "EXIT" ,  cmd_exit },
        { "LIST", cmd_list },
        { "READ", cmd_read },
        { "DELETE", cmd_delete },
        { "UPDATE", cmd_update }
};
Run Code Online (Sandbox Code Playgroud)

cmd cmds[] = {
        { "CREATE", cmd_create },
        { "EXIT" ,  cmd_exit },
        { "LIST", cmd_list },
        { "READ", cmd_read },
        { "DELETE", cmd_delete },
        { "UPDATE", cmd_update },
        { NULL, NULL }
};
Run Code Online (Sandbox Code Playgroud)