【发布时间】: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