C++实现的Brainfuck解释器无法运行通用Hello World程序求助
问题定位
以下是你代码中导致执行异常的核心问题:
- 内存数组未初始化
你声明的局部数组int array[30000];没有做清零操作,C++局部栈数组初始值为随机垃圾值,直接导致[指令的跳转判断逻辑完全不符合预期,整个循环执行逻辑错误。 - 未跳过非指令字符
你仅对<>+-.,[]八个Brainfuck有效指令做了处理,如果输入代码包含空格、换行、注释等其他字符,你的代码不会对指令指针pos执行自增操作,会卡在无效字符位置无限循环,无法继续执行后续代码。 - (可选优化)缺少数据指针边界校验
当前没有对pos_in_stack做上下限校验,当代码出现超出30000范围的指针移动时,会触发数组越界访问,引发未定义行为。
修复方案
- 初始化内存数组,将所有元素初始值设为0:
// 把原来的数组声明改成下面的写法 int array[30000] = {0};
- 在所有指令判断逻辑的末尾,添加无效字符跳过逻辑:
// 放在所有if指令判断的最后面 // 所有有效指令都已经通过continue跳过了本段逻辑,只有无效字符会走到这里 pos++;
- (可选)添加数据指针边界校验,避免越界访问:
// 处理>指令时 if(file_data.at(pos) == '>') { pos_in_stack++; if(pos_in_stack >= 30000) pos_in_stack = 0; // 或者根据需求做越界拦截 pos++; continue; } // 处理<指令时 if(file_data.at(pos) == '<') { pos_in_stack--; if(pos_in_stack < 0) pos_in_stack = 29999; // 或者根据需求做越界拦截 pos++; continue; }
修改完成后重新编译运行,即可正常执行标准Brainfuck Hello World代码。
内容的提问来源于stack exchange,提问作者Ed May
相关产品推荐
相关产品推荐

