You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段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;
}

修复说明

  1. 将指针数组改为普通int数组,符合存储整数的需求。
  2. 修正数组越界问题,仅操作有效索引0-3,打印对应4个元素。
  3. 初始化iChoice为0,避免未初始化问题。
  4. 将循环条件改为while (iChoice != 0),使用比较操作而非赋值,实现用户输入0时退出循环。
  5. 添加输入验证:检查scanf返回值,处理非法输入;验证数组编号范围,避免越界。
  6. 修复用户输入编号到数组索引的转换(用户输入1对应索引0)。

内容的提问来源于stack exchange,提问作者c_and_me1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:33:28