C语言数组循环排列代码异常求助:输出不符问题排查
数组循环排列代码的BUG修复与解决方案
我需要实现对含n个整数的数组执行循环排列操作,尝试不使用指针仅通过数组编写代码,但运行时出现异常:
- 输入6元素数组(1,2,3,4,5,6)时,实际仅输出左括号,无法得到完整的循环排列结果
- 怀疑
pcircular函数中数组值无法传递至write函数,且数组大小超过6时功能失效
原代码
#include <stdio.h> int ArraySize(){ // get the size of the array int size; printf("What's the array size? "); scanf("%d", &size); return size; } void readArray(int size, int array[]){ /*put the values in the first array*/ for (int i = 0; i < size; i++){ printf("What is the \033[1;36m%d\033[m value? ", i+1); scanf("%d", &array[i]); } } void pcircular(int size, int array[size][size]){ //Circular permutation function for (int j = 0; j <= size; j++){ /* printf("("); */ for (int i = 0; i < size; i++){ if (i == size - 1){ array[j+1][0] = array[j][i]; /* printf("%d", array[j+1][0]); */ } else{ array[j+1][i+1] = array[j][i]; /* printf("%d", array[j+1][i+1]); printf(", "); */ } } /* printf(")"); */ } } void writeArray(int size, int array[size][size]){ //Write the Array for (int i = 0; i <= size; i++){ printf("("); for (int j = 0; j < size; j++){ /* printf("\ni = %d j = %d\n", i, j); */ printf("%d", array[i][j]); if (j != size-1){ printf(", "); } } printf(")"); } } void main(){ int size = ArraySize(); int list[size][size]; // create the array readArray(size, list[0]); pcircular(size, list); writeArray(size, list); }
输入示例
What's the array size? 6 What is the 1 value? 1 What is the 2 value? 2 What is the 3 value? 3 What is the 4 value? 4 What is the 5 value? 5 What is the 6 value? 6
预期输出
(1, 2, 3, 4, 5, 6)(6, 1, 2, 3, 4, 5)(5, 6, 1, 2, 3, 4)(4, 5, 6, 1, 2, 3)(3, 4, 5, 6, 1, 2)(2, 3, 4, 5, 6, 1)(1, 2, 3, 4, 5, 6)
实际输出
(
问题分析与修复方案
核心BUG:数组越界访问
pcircular函数中的循环条件for (int j = 0; j <= size; j++)会导致严重的数组越界:
- 二维数组
array的行数为size,合法索引范围是0到size-1 - 当
j = size时,代码尝试访问array[j+1][...]即array[size+1][...],超出数组的合法内存范围,会破坏栈数据,导致程序行为异常(比如只输出左括号)
修复步骤
修正
pcircular的循环条件
将循环改为for (int j = 0; j < size; j++),这样j的取值范围是0到size-1,j+1的最大值为size,刚好对应二维数组的最后一行索引(合法)。修复后的完整代码
#include <stdio.h> int ArraySize(){ // get the size of the array int size; printf("What's the array size? "); scanf("%d", &size); return size; } void readArray(int size, int array[]){ /*put the values in the first array*/ for (int i = 0; i < size; i++){ printf("What is the \033[1;36m%d\033[m value? ", i+1); scanf("%d", &array[i]); } } void pcircular(int size, int array[size][size]){ //Circular permutation function for (int j = 0; j < size; j++){ // 修正循环条件,避免越界 for (int i = 0; i < size; i++){ if (i == size - 1){ array[j+1][0] = array[j][i]; } else{ array[j+1][i+1] = array[j][i]; } } } } void writeArray(int size, int array[size][size]){ //Write the Array for (int i = 0; i <= size; i++){ printf("("); for (int j = 0; j < size; j++){ printf("%d", array[i][j]); if (j != size-1){ printf(", "); } } printf(")"); } } int main(){ // 符合标准C规范的main函数定义 int size = ArraySize(); int list[size][size]; // create the array readArray(size, list[0]); pcircular(size, list); writeArray(size, list); return 0; }
额外优化
- 将
void main()改为int main()并返回0,符合标准C的规范。
内容的提问来源于stack exchange,提问作者benno vasconcellos
相关产品推荐
相关产品推荐

