如何解决C++代码中while循环接收4次以上输入后意外终止的问题
故障成因
- 首要问题是动态内存分配语法使用错误:你代码中
int *Angka = new int(x);的含义是申请1个int类型的堆内存空间,并将该空间的初始值设为x(此时x为0),并不是你以为的「申请长度为x的int数组」。C++中申请动态数组的正确语法是new int[数组长度],使用方括号而非小括号。 - 直接触发崩溃的原因是数组越界访问:你自始至终只申请了1个int的存储空间,循环输入时不断向
Angka[x]位置写入数据,当x≥1时就已经发生了非法的内存越界写入,属于C++标准中的「未定义行为」。这类行为的表现完全取决于运行环境:在线编译器环境下越界写入的内存刚好没有被程序其他逻辑占用,所以看似运行正常;而MinGW编译后的程序在写入越界内存时覆盖了栈上的控制数据(比如函数返回地址、循环变量值等),就会直接触发崩溃、卡死的现象,这不是编译器的问题,是代码本身的内存错误。 - 额外的逻辑缺陷:即便你修正了初始的数组申请语法,由于你没有做数组扩容逻辑,只要输入的元素数量超过初始数组的长度,仍然会触发越界问题。同时排列数计算逻辑没有做参数合法性校验,当用户输入的选取数量大于总数字量时会触发死循环和整数溢出。
修复建议
推荐直接使用std::vector代替手动管理动态数组,容器会自动处理扩容逻辑,不需要手动管理内存,也能避免越界问题。修复后的参考代码如下:
#include <iostream> #include <string> #include <vector> using namespace std; int main() { int KombAngka; bool Lanjut = true; int x = 0; vector<int> Angka; // 用vector代替手动动态数组 string YaTidak; while(Lanjut) { int input; cout << "Number-" << x + 1 << ": "; cin >> input; Angka.push_back(input); // 自动扩容 LoopYaTidak: cout << "Are the numbers enough?(y/n)?: "; cin >> YaTidak; if (YaTidak == "y") { Lanjut = false; } else if (YaTidak == "n") { Lanjut = true; } else { cout << "Enter the correct answer!(y/n)" << endl; goto LoopYaTidak; } x++; } cout << "All numbers: ("; for (int z = 0; z <= x - 2; z++) { cout << Angka[z] << ", "; } cout << Angka[x - 1] << ")" << endl; // 增加合法性校验 cout << "The number of combinations of numbers used: "; cin >> KombAngka; if (KombAngka > x || KombAngka < 1) { cout << "Invalid input! The number must be between 1 and " << x << endl; system("pause"); return 1; } long long JumlahAngka = x; // 用long long避免整数溢出 const int StopLoop = x - KombAngka; for (int i = x - 1; i > StopLoop; i--) { JumlahAngka = JumlahAngka * i; } cout << "The number of queue numbers consisting of " << KombAngka << " different numbers are " << JumlahAngka << endl; system("pause"); return 0; }
内容的提问来源于stack exchange,提问作者azhrzf
相关产品推荐
相关产品推荐

