问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

问一个C语言的结构体的函数指针和数组之间的问题

发布网友 发布时间:2024-02-16 19:59

我来回答

5个回答

热心网友 时间:2024-02-20 13:46

按你原来那样写,编译之后,这样报错:
[root@localhost test]# gcc 6.c
6.c:20: error: initializer element is not constant
6.c:20: error: (near initialization for ‘KeyboardTab[0].CurrentOperate’)
6.c:21: error: initializer element is not constant
6.c:21: error: (near initialization for ‘KeyboardTab[1].CurrentOperate’)
6.c:22: error: initializer element is not constant
6.c:22: error: (near initialization for ‘KeyboardTab[2].CurrentOperate’)
6.c:23: error: initializer element is not constant
6.c:23: error: (near initialization for ‘KeyboardTab[3].CurrentOperate’)
6.c:24: error: initializer element is not constant
6.c:24: error: (near initialization for ‘KeyboardTab[4].CurrentOperate’)
把源代码修改成这样:
KeyTabStruct KeyboardTab[43] =
{
{0 ,0 ,0 ,1 ,0 ,&Menu0},
{1 ,1 ,1 ,2 ,42,&Menu1},
{2 ,2 ,2 ,3 ,42,&Menu2},
............
{41,41,41,42,40,&Menu41},
{42,42,42,0 ,0 ,&Menu42}
};
其余的不变,之后编译,结果为
[root@localhost test]# gcc 6.c
6.c:20: warning: initialization from incompatible pointer type
6.c:21: warning: initialization from incompatible pointer type
6.c:22: warning: initialization from incompatible pointer type
6.c:23: warning: initialization from incompatible pointer type
6.c:24: warning: initialization from incompatible pointer type
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
再加上main函数即可。
原因:指针即地址,函数指针也不例外,调用函数指针的时候,用的是函数所在的地址,“&”是取地址符。

热心网友 时间:2024-02-20 13:47

void (*Menu0)(void);
void (*Menu1)(void);
void (*Menu2)(void);
//......
void (*Menu41)(void);
void (*Menu42)(void);

/*先定义一个结构体*/
typedef struct
{
unsigned char KeyStateIndex; //当前状态索引号
unsigned char KeyDownState; //按下“向下”键时转向的状态索引号
unsigned char KeyUpState; //按下“向上”键时转向的状态索引号
unsigned char KeyEnterState; //按下“确认”键时转向的状态索引号
unsigned char KeyBackState; //按下“返回”键时转向的状态索引号
void (*CurrentOperate)(void);
}KeyTabStruct;
/*再定义一个数组*/
KeyTabStruct KeyboardTab [43] =
{
{0 ,0 ,0 ,1 ,0 ,(&Menu0)},
{1 ,1 ,1 ,2 ,42,(&Menu1)},
{2 ,2 ,2 ,3 ,42,(&Menu2)},
// ........
{41,41,41,42,40,(&Menu41)},
{42,42,42,0 ,0 ,(&Menu42)}
};

热心网友 时间:2024-02-20 13:47

{1 ,1 ,1 ,2 ,42,(*Menu1 )},
//改为:
{1 ,1 ,1 ,2 ,42,Menu1},
//后面其他行同理。

热心网友 时间:2024-02-20 13:48

{0 ,0 ,0 ,1 ,0 ,&Menu0}
......

对函数指针取地址,得到函数地址

热心网友 时间:2024-02-20 13:49

你的函数指针不是常量。所以编译不过,自己改改。追问怎么改成常量,指针我很少用,不怎么清楚,谢谢

追答说明白点就是类型不匹配。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 在结构体中定义指针,在调用的函数里面为这个指针分配地址为啥会出错?该... 明末枭雄txt全集下载1 那个写极品公子的作者烽火为什么不写了。如果有更新该在哪里看18 ...我: 在网购中,“付快递费”、“到付”、“自提”各是什么意思? 谢 ... 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 我一个手机号注册了两个,另外一个登不上了,怎么办? 一个手机号绑定了两个,那个以前的登录不上了,怎么办? 一个手机号绑定了两个,那个以前的登录不上了,怎么办? 用苹果手机怎么做到第二次修改 同一个手机号注册了两个微信,第一登不上了怎么办? 修改一年内如何二次修改吗苹果 银行卡异地存取款要手续费吗 只有微信昵称,没有,如何找回 只知道微信昵称怎么找回 只记得微信昵称,如何找回? 求不同角度看的历史人物 比如曹操,世人都认为是奸雄, 而我要...41 男主重生古代成为一个锦衣卫自带奸雄系统的可以抽取历史人物的4 我和哪一个历史人物最相似2 三国历史人物评价126 枭雄、英雄、奸雄分别是什么意思?21 在函数中为啥使用结构体指针数组,为其赋值赋不上,(申请了空间),在mai... 我一个手机号注册了两个,另外一个登不上了,怎么办? C结构体指针 malloc函数问题 麻烦解释哪里错了,越细致越好。 为什么函数里gets无法读入到结构体指针里的数组? 如果结构体指针被传递到函数中,如何让函数中结构体数据的改变传递回主... 您的手机号在最近24小时内绑定过三个,已达到限制,...24小时后... ...两个,有一个显示零钱支付超过10万被限制了,另外一个可以支付... 实名认证两个,其中一个支付时说限额10万,但是这两个加一... 实名认证两个,其中一个支付时说限额10万,但是这两个加一... 手机号1 24 手机号24小时内绑定了两个被限制 请问什么时候才能重 ... 同一个手机号注册了两个微信,第一登不上了怎么办? 您的手机号在最近24小时内绑定过三个,已达到限制,...24小时后... 手机号绑定了达到限制不能绑定其他是什么意思? ...号注册了两个,另外一个登不上了,怎么办?密码也忘记,手机绑 ... 同一个手机号注册了两个微信,第一登不上了怎么办? ...号在最近24小时内绑定过三个,已达到限制,...24小时后可以再次... 关于微信绑定上限的问题:你的手机号在最近24小时内已绑定过3个... 请问一个手机号注册了两个,但登不上另一个怎么办啊? ...号在最近24小时内绑定过三个,已达到限制,...24小时后可以再次... 我用一个手机号登录了两个现在只能登一个哪个登不上怎么办?