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

调试二维数组填充代码时变量a与num值异常变更求助

问题原因分析与修复方案

核心问题:未初始化变量定义数组 + 数组越界访问

你的代码里有两个致命问题,直接导致a和num的值莫名变更:

  1. 数组定义时使用未初始化的num
    你在执行scanf("%d",&num);之前就定义了int arr[num][num];,此时num是未初始化的局部变量,值为随机垃圾值,数组的实际大小完全不确定。这种写法虽属于C标准中的可变长度数组(VLA),但用未初始化变量指定数组大小是完全错误的,会导致内存布局混乱。

  2. 数组越界写入破坏栈内存
    循环中b从0开始持续自增,当b超过数组第二维的实际长度(因数组大小随机,大概率远小于你输入的t),就会触发数组越界写入。局部变量都存储在栈上,arr、a、num的内存地址连续,越界写入会直接覆盖相邻变量的内存空间,这就是a和num值莫名变化的根源。

修复后的代码

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int num, t; 
    int count = 1; 
    int a = 0, b = 0; 
    int **arr; 

    printf("Input Number : ");
    // 先读取合法的num值
    if (scanf("%d",&num) != 1 || num <= 0) {
        printf("Invalid input\n");
        return 1;
    }
    
    t = num;    

    // 动态分配二维数组内存
    arr = malloc(num * sizeof(int *));
    for (int i = 0; i < num; i++) {
        arr[i] = malloc(num * sizeof(int));
    }
    
    for(int i = 0 ; i < t ; i++)    
    {
        // 避免越界,填满一行后切换到下一行
        if (b >= num) {
            a++;
            b = 0;
            if (a >= num) break;
        }
        arr[a][b] = count;
        b++;
        count++;
    }

    // 释放动态分配的内存,避免泄漏
    for (int i = 0; i < num; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

关键修复点说明

  • 先初始化num再创建数组:将数组创建逻辑放在scanf之后,确保数组大小是确定的合法值,这里用动态内存分配替代VLA,避免不确定性。
  • 添加越界检查:在循环中判断b是否超出数组范围,防止越界写入破坏其他变量。
  • 内存释放:动态分配的内存必须手动释放,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:50:45