C 在函数指针数组中循环

C 在函数指针数组中循环,c,function,pointers,C,Function,Pointers,我有这个结构: typedef struct { void (*func)(instruction); union { double db; char ch; }; } instruction; 在我的源文件中,我有这些指令的数组。我的问题是,如何循环该数组并执行每个结构的函数 我以为我知道怎么做,但是指令函数有一个参数,这个参数就是指令,这一事实似乎会引起问题。因此,这不起作用: int i; for (i = 0; i <

我有这个结构:

typedef struct {
    void (*func)(instruction);
    union {
        double db;
        char ch;
    };
} instruction;
在我的源文件中,我有这些指令的数组。我的问题是,如何循环该数组并执行每个结构的函数

我以为我知道怎么做,但是指令函数有一个参数,这个参数就是指令,这一事实似乎会引起问题。因此,这不起作用:

int i;
    for (i = 0; i <= instr_count; i++) {
        (*instr[i].func) (instr[i]);
        }
inti;
对于(i=0;i 64 | | n<71)
next.ch=n;
否则{
双n;
扫描频率(“%lf”,arg,n);
next.db=n;
}
instr[instr_count]=下一步;
仪器计数++;
}
否则{
c=指令[0];
开关(c){
案例“A”:
next.func=addFunc;
打破
案例S:
next.func=子函数;
打破
案例“M”:
next.func=multFunc;
打破
案例“D”:
next.func=divFunc;
打破
违约:
打破
}
instr[instr_count]=下一步;
仪器计数++;
}
}
fclose(数据文件);
}
作为一个快速的解释,该代码获取一个“中间代码”文件,确定指令,并为每个指令创建一个指令结构,其中包含正确的函数指针

运行代码时会出现以下运行时错误:

“解释器中0x00000000处的未处理异常:0xC0000005: 访问冲突。”(使用VS2010编译)


不看代码的其余部分很难判断,但是错误中列出的地址(
0x00000000
)意味着数组中的函数指针之一是
NULL


在遍历数组之前,能否验证数组是否已正确初始化?

取决于
instr
指令的数组
还是
指令*
,您希望

instr[i].func(&instr[i]);

我怀疑您想要第一个(指令数组),因为您将为此编译(大多数编译器上都有警告);函数中的参数只会得到垃圾

然而,您得到的异常表明这不是您的问题——您的数组中可能有一条带有NULL
func
指针的指令

编辑

看起来你在犯经典的
错误,而(!feof(input))
错误——每当你看到这一点,它几乎总是错误的

问题是,在读取输入的最后一行之后,
feof
仍将返回false——在您尝试读取输入的末尾并收到EOF结果之前,它不会返回true。因此,在输入代码结束后,您将得到一个额外的循环迭代,其中有一个空行,这可能会导致您看到的崩溃


您可能想要的是
while(!(str=get\u next\u string())
或者
while(!(str=fgets(buffer,sizeof(buffer),datafile)))

看起来你的函数指针是一个空指针。这确实是在哪一行中崩溃的?我已经编辑了我的文章以包含要填充数组的函数。@ TrOrCOSO考虑了遇到“P”、“A”、“S”、“M”或“D”以外的一些情况。你的输入是什么样子的?我的输入非常严格。指令仅为Pop、Push、Add、Sub、Mult和Div。每条指令位于单独的一行。因为这是一个类赋值,所以它不是为了测试错误的输入。@Troncoso…而且您绝对确定指令[0]总是“P”、“a”、“s”、“M”或“D”中的一个?不管是哪种方式,您都应该尝试在调试器下运行此程序,以查看崩溃发生的位置,最好是逐步了解您的逻辑以了解原因。是。每一行都以其中一个字符开头。我有一个初始化为0的计数器,每次添加指令时计数器都会增加。崩溃发生在我要写的那行。没有它,程序就可以正常编译。我已经编辑了我的帖子,其中包含了应该填充数组的函数。
instr[i].func(&instr[i]);
instr[i]->func(instr[i]);