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

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][...],超出数组的合法内存范围,会破坏栈数据,导致程序行为异常(比如只输出左括号)

修复步骤

  1. 修正pcircular的循环条件
    将循环改为for (int j = 0; j < size; j++),这样j的取值范围是0到size-1,j+1的最大值为size,刚好对应二维数组的最后一行索引(合法)。

  2. 修复后的完整代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:10:27