【问题标题】:Undefined elements in struct array结构数组中未定义的元素
【发布时间】:2014-08-11 12:19:26
【问题描述】:

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

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

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

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;
}    

请不要这样

stricmp()

不是拼写错误,它是不区分大小写的 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: �(�

之后我得到了段错误。在我看来,该结构数组中好像有一些未定义的元素,但它们来自哪里?我在看什么?在此先感谢您的任何指点。

【问题讨论】:

  • 您需要一个sentinel value 来终止您的命令列表。因为这是一个结构体,所以空命令和空函数指针都可以工作。
  • 不是答案,只是注意。不要使用以_ 开头的标识符,因为它是为实现而保留的。
  • 感谢您的提示,这很好,请参阅下面的评论:)
  • 另外,我喜欢这个帖子,因为这个帖子写得很好,结构很好,并且非常清楚作者在寻找什么。 :)

标签: c arrays struct segmentation-fault


【解决方案1】:

您需要在列表末尾添加一个“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 }
};

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

【讨论】:

  • 感谢您的快速回复,这是一种魅力。为什么我需要在列表中显式添加一个 NULL、NULL 元素?我不是在检查 (c->name == NULL) 而是在没有找到任何内容时返回 NULL?
  • 但是你正在测试c->name == NULL。这是您的 for 循环的终止条件。这就是 for 语句中的中心表达式所做的。
  • @Fish-Guts,你的循环终止条件是c->name,即c->name != NULL。通过添加标记NULL 元素,它允许for 循环退出。
  • 我明白了,当然可以,谢谢你的回答,我现在明白了:)
猜你喜欢
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2017-05-25
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多