所以我之前遇到过这个问题,我想知道是否有人可以帮助我。这真的很奇怪,我从来没有见过这样的东西。
所以我有这个设置功能,它基本上填充了我的全局操作函数数组:
//A function Pointer is a type def that accepts two ints
fcnptr *opCode_Array; //Global Array of fcnptrs
void SetUp() {
int i;
fcnptr temp[41] = {NULL,movOP_1,mviOP_2,mifOP_3,mitOP_4,lriOP_5,ldrOP_6,strOP_7,mvrOP_8,addOP_9,addriOP_10,subOP_11,mulOP_12, divOP_13, orOP_14, andOP_15, notOP_16, bOP_17, beqOP_18, bneOP_19, bgtOP_20, bgeOP_21, bltOP_22, bleOP_23, pushdOP_24, pushrOP_25, pushiOP_26, popdOP_27, poprOP_28, putiOP_29, putsOP_30, lineOP_31, getiOP_32, getsOP_33, callOP_34, retOP_35, stopOP_36,addOP_9,addriOP_10,subOP_11,mulOP_12};
opCode_Array = (fcnptr*)malloc(41 * sizeof(fcnptr));
//fill global array with functions
for(i = 0; i < 41; i++) {
opCode_Array[i] = temp[i];
}
}
后来我有一个函数调用这样的操作函数:
void fetchExecute(int codeStoreLength) {
while(instructionPointer < codeStoreLength) {
//ip does not point to the instruction it is to execute during the loop, but the instruction that follows it.
instructionPointer += 3;
(*opCode_Array[codeStore[instructionPointer - 3]])(codeStore[instructionPointer - 2], codeStore[instructionPointer - 1]);
}
}
所以通常情况下这一切都很好,但是昨天晚上和今天我遇到了一些错误,当只调用特定函数时,或者更准确地说,试图访问opCode_Array的特定索引时会导致分段错误。
如果你注意到,我有两个版本的Addop,一个在索引9,另一个在索引37.当测试我的函数时,我会在索引9调用Addop时出现分段错误,即使代码被完全注释掉了。我提出了一个快速而肮脏的黑客,只是在数组的末尾添加了另一个Addop,从现在开始从索引37调用addop。这完全没用,并通过了所有的测试。
现在,另一个索引显示相同的行为。值得一提的是,同样的指数在之前的测试中表现完美。这发生在我的几个函数中,所以我宁愿弄清楚它为什么这样做而不仅仅是永久地移动索引。
到目前为止,我已经尝试了p;使用指针进行处理并使opCode_Array保持静态,但两者都没有帮助..
编辑:谢谢大家的提示和帮助。我无法找到问题的根源,但我能够通过将数组本地化为fetchexecute而不是全局来修复它。我会发布更多代码,但这是一个每年都可以重复使用的学校项目..
经验教训?除非你猜得太多,否则不要制作全局...