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

C语言稀疏矩阵检测转置代码在VSCode运行不全在线编译器正常

问题分析与修复方案

根因定位

本地VSCode运行异常、在线编译器运行正常的差异来自代码的未定义行为:

  • changematrix函数中定义的int b[100][100], temp, counter = 0; 行里,temp变量仅做了声明,没有初始化赋值就直接在后续逻辑里执行temp++、作为数组下标访问b[temp]。
  • C标准明确规定:函数内的局部非静态变量不会自动初始化为0,初始值为栈内存上的随机残留值。在线编译器出于调试友好的设计,通常会默认把栈内存清零,所以temp刚好从0开始,代码能正常运行;而VSCode使用的本地编译器没有做这个额外处理,随机值的temp会导致数组越界写入,轻则后续打印逻辑读取到错误值、无输出,重则直接程序崩溃。

修复方法

只需要给temp变量赋初始值0即可,同时可以优化老式的函数声明写法,避免潜在参数不匹配问题:

1. 单点修复(仅修改出错行)

将changematrix函数内的变量定义行修改为:

int b[100][100], temp = 0, counter = 0;

2. 完整修复后的代码

#include <stdio.h>

// 优化函数声明,明确参数列表,避免参数传递错误
int checksparse(int array[100][100], int r, int c);
int changematrix(int array[100][100], int r, int c);

int main()
{
    int a[100][100];
    int i, j, r, c;
    printf("Enter number of rows and columns in the matrix\n");
    scanf("%d%d", &r, &c);
    printf("\nEnter the elements in the matrix");
    for (i = 0; i < r; i++)
    {
        for (j = 0; j < c; j++)
        {
            printf("\na[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
        }
    }
    int check = checksparse(a, r, c);
    if (check == 1)
    {
        printf("\nIts a sparse matrix\n");
        changematrix(a, r, c);
    }
    else if (check == 0)
    {
        printf("\nIts not a sparse matrix");
    }
    return 0;
}
int checksparse(int array[100][100], int r, int c)
{
    int counter = 0, flag = 1;
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            if (array[i][j] == 0)
                counter++;
        }
    }
    if (counter > ((r * c) / 2))
    {
        return flag;
    }
    else
    {
        flag = 0;
        return flag;
    }
}
int changematrix(int array[100][100], int r, int c)
{
    // 给temp赋初始值0,修复未初始化问题
    int b[100][100], temp = 0, counter = 0;

    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            if (array[i][j] != 0)
            {
                b[temp][0] = i;
                b[temp][1] = j;
                b[temp][2] = array[i][j];
                temp++;
                counter++;
            }
        }
    }

    printf("\nSparse Matrix : \n");

    for (int i = 0; i < counter; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%d ", b[i][j]);
            printf("\t");
        }
        printf("\n");
    }

    printf("\nTranspose of Sparse Matrix : \n");

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < counter; j++)
        {
            printf("%d ", b[j][i]);
            printf("\t");
        }
        printf("\n");
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:45:03