C++编写equalsArray调用两次readNumbers报错修复
问题根因
你遇到的control reaches end of non-void function编译报错,是因为声明为返回bool类型的equalsArray函数,在length < 1的分支没有写返回值,函数执行到末尾没有return语句就会触发这个错误。除此之外你的代码还有几个会导致运行异常的问题:
readNumbers数组下标越界:new int[10]申请的数组合法下标范围是0~9,你写的循环i从1到10,会访问a[10]的越界内存,属于未定义行为readNumbers中执行a++后再返回指针,返回的不是new申请的内存起始地址,后续调用delete[]释放内存时会直接程序崩溃- 括号匹配错误:
main函数被写在了equalsArray函数内部,属于语法错误 - 没有输出对比结果,也没有释放申请的堆内存,存在内存泄漏
- 没有实现题目要求的「数组长度小于1时返回false」的逻辑
修正后代码
按照题目要求拆分两个文件:
function-3-1.cpp
#include <iostream> using namespace std; int* readNumbers() { int* arr = new int[10]; // 从下标0开始遍历,覆盖全部10个合法位置 for (int i = 0; i < 10; i++) { cin >> arr[i]; } // 直接返回内存起始地址,不修改指针本身 return arr; } bool equalsArray(int* numbers1, int* numbers2, int length) { // 长度小于1直接返回false,补全分支返回值解决编译报错 if (length < 1) { return false; } // 逐位对比元素 for (int i = 0; i < length; i++) { if (numbers1[i] != numbers2[i]) { return false; } } return true; }
main-3-1.cpp
#include <iostream> using namespace std; // 声明外部定义的函数 int* readNumbers(); bool equalsArray(int* numbers1, int* numbers2, int length); int main() { int* arr1 = readNumbers(); int* arr2 = readNumbers(); bool result = equalsArray(arr1, arr2, 10); // 按要求格式输出结果 cout << (result ? "True(1)" : "False(0)") << endl; // 释放堆内存 delete[] arr1; delete[] arr2; return 0; }
运行验证
输入题目给出的测试用例(连续输入1到10两次),程序会输出True(1),和期望结果一致。
内容的提问来源于stack exchange,提问作者Xu Shuo ze
相关产品推荐
相关产品推荐

