为何这段C语言代码中的do-while循环会提前终止?
指针数组赋值程序崩溃问题修复
问题描述
编写了一段尝试将变量赋值给数组索引的代码,但运行时输入要访问的数组编号后程序直接终止。怀疑scanf无法修改iChoice的值,且iChoice未初始化。尝试用while循环和if语句调整控制流,未解决问题。
原代码
#include <stdio.h> int main() { int x; int iChoice; int *iArray[4]; int iNumber; *iArray = iNumber; for (x = 0; x < 5; x++) { iArray[x] = '\0'; } do { system("clear"); printf("\n\t\tENTER NUMBERS INTO AN ARRAY\n"); printf("\nArray element #1: %d", iArray[0]); printf("\nArray element #2: %d", iArray[1]); printf("\nArray element #3: %d", iArray[2]); printf("\nArray element #4: %d", iArray[3]); printf("\nArray element #5: %d", iArray[4]); printf("\n\nEnter an array number to access: "); scanf("%d", &iChoice); } while (iChoice = NULL); do { printf("\n\t\tEnter a number to fill in: "); scanf("%d", &iNumber); break; } while (iChoice != NULL); return 0; }
核心错误分析
- 数组越界访问:
int *iArray[4]是包含4个指针元素的数组,有效索引为0-3。但代码中循环x < 5赋值iArray[4],打印时也输出第5个元素,触发未定义行为,可能导致程序崩溃或异常。 - 循环条件错误:
while (iChoice = NULL)是赋值操作而非比较操作,将NULL(即0)赋值给iChoice,条件表达式结果为0,循环仅执行一次就退出,这是程序输入后直接终止的根本原因。 - 类型不匹配与未初始化:
*iArray = iNumber:*iArray是int*类型,iNumber是int类型,直接赋值类型不兼容;且iNumber未初始化,赋值无意义。iChoice未初始化,读取未初始化变量会触发未定义行为。
- 指针打印格式错误:用
%d打印指针类型的iArray[x],应使用%p格式符;若需求是存储整数而非指针,数组类型定义错误,应该用int iArray[4]而非int *iArray[4]。
修复后的代码(假设需求是存储整数)
#include <stdio.h> #include <stdlib.h> // 用于system函数 int main() { int x; int iChoice = 0; // 初始化变量 int iArray[4] = {0}; // 定义int数组并初始化为0,有效索引0-3 int iNumber; do { system("clear"); printf("\n\t\tENTER NUMBERS INTO AN ARRAY\n"); printf("\nArray element #1: %d", iArray[0]); printf("\nArray element #2: %d", iArray[1]); printf("\nArray element #3: %d", iArray[2]); printf("\nArray element #4: %d", iArray[3]); printf("\n\nEnter an array number (1-4) to access, or 0 to exit: "); // 检查scanf输入是否成功,避免非法输入导致死循环 if (scanf("%d", &iChoice) != 1) { // 清除输入缓冲区的非法字符 while(getchar() != '\n'); printf("Invalid input! Please enter a number.\n"); continue; } // 验证输入的数组编号是否合法 if (iChoice < 0 || iChoice > 4) { printf("Invalid array number! Please enter 1-4 or 0 to exit.\n"); // 暂停让用户看到提示 getchar(); getchar(); } } while (iChoice != 0); // 输入0时退出循环 if (iChoice != 0) { printf("\n\t\tEnter a number to fill in: "); // 同样检查输入有效性 while (scanf("%d", &iNumber) != 1) { while(getchar() != '\n'); printf("Invalid input! Please enter a number: "); } // 转换为数组索引(用户输入1对应索引0) iArray[iChoice - 1] = iNumber; } return 0; }
修复说明
- 将指针数组改为普通
int数组,符合存储整数的需求。 - 修正数组越界问题,仅操作有效索引
0-3,打印对应4个元素。 - 初始化
iChoice为0,避免未初始化问题。 - 将循环条件改为
while (iChoice != 0),使用比较操作而非赋值,实现用户输入0时退出循环。 - 添加输入验证:检查
scanf返回值,处理非法输入;验证数组编号范围,避免越界。 - 修复用户输入编号到数组索引的转换(用户输入1对应索引0)。
内容的提问来源于stack exchange,提问作者c_and_me1
相关产品推荐
相关产品推荐

