调试二维数组填充代码时变量a与num值异常变更求助
问题原因分析与修复方案
核心问题:未初始化变量定义数组 + 数组越界访问
你的代码里有两个致命问题,直接导致a和num的值莫名变更:
数组定义时使用未初始化的
num
你在执行scanf("%d",&num);之前就定义了int arr[num][num];,此时num是未初始化的局部变量,值为随机垃圾值,数组的实际大小完全不确定。这种写法虽属于C标准中的可变长度数组(VLA),但用未初始化变量指定数组大小是完全错误的,会导致内存布局混乱。数组越界写入破坏栈内存
循环中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
相关产品推荐
相关产品推荐

