【问题标题】:can not run the matrix operation C program in code blocks不能在代码块中运行矩阵运算C程序
【发布时间】:2017-02-17 13:03:51
【问题描述】:

我为矩阵运算编写了一个 C 代码。行和列的值应该是用户定义的。当我尝试运行代码时,会出现一个显示“matrix_addition.exe has stopped working”的弹出窗口。为什么会这样?构建代码时没有错误。

#include <stdio.h>
int main ()
{
    int r,c,i,j,a_matrix[r][c],b_matrix[r][c];
    printf("Enter the number of rows and columns of matrix\n");
    scanf("%d %d", &r, &c);

    printf("enter the elements of the first matrix \n");
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            printf("a_matrix[%d][%d]:",i,j);
            scanf("%d",&a_matrix[i][j]);  //array input
        }
    }

    printf("\n enter the elements of the second matrix \n");
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            printf("b_matrix[%d][%d]:",i,j);
            scanf("%d",&b_matrix[i][j]);  //array input
        }
    }
    return 0;
}

请查看错误弹出窗口的图片。

【问题讨论】:

  • 您是否期望a_matrixb_matrixrc 被分配有效值后神奇地增长到适当的大小?一般来说,C 不是这样工作的。
  • 为了便于阅读和理解:1) 遵循公理:每行只有一个语句,并且(最多)每条语句一个变量声明。 2) 变量名称应表明contentusage(或更好,两者兼有)。
  • 变量rc的值必须在使用它们声明数组之前赋值:a_matrix[r][c]b_matrix[r][c]
  • 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功。

标签: c arrays matrix codeblocks


【解决方案1】:

您的程序使用了可变长度数组。但它使用具有未指定值的变量初始化它们。你的程序的行为是未定义的,你很幸运它崩溃了而不是看起来工作。

int r,c,i,j,a_matrix[r][c],b_matrix[r][c];
    ^
    unspecified value used to initialize the sizes of a_matrix and b_matrix

直接的解决方案是在获得用户输入后简单地移动矩阵定义:

int r,c,i,j;
printf("Enter the number of rows and columns of matrix\n");
scanf("%d %d", &r, &c);

int a_matrix[r][c], b_matrix[r][c];

VLA 是由 C99 引入的,该标准引入的另一个特性是能够在块范围内的任何位置定义变量,而不仅仅是开始。事实上,您应该努力将变量定义为尽可能接近它们的初始使用点。 IMO 使代码比在函数开头将它们全部捆绑在一起更清晰易读。


如果我没有警告您使用 VLA 会带来一定的风险,那我就是失职了。 C 语言的大多数现代实现都使用在运行时包含函数变量的调用堆栈。该调用堆栈的大小相当有限,如果您在其上定义一个非常大的 VLA,您的程序将溢出堆栈并立即终止。

【讨论】:

    【解决方案2】:

    您在定义两个可变长度数组时调用未定义的行为,但使用变量初始化它们您尚未将其作为输入,因此没有指定它们的值

    您可以在读取数组大小的位置之后移动数组的声明。所以改变这部分:

    int r,c,i,j,a_matrix[r][c],b_matrix[r][c];
    printf("Enter the number of rows and columns of matrix\n");
    scanf("%d %d", &r, &c);
    

    到:

    int r,c,i,j;
    printf("Enter the number of rows and columns of matrix\n");
    scanf("%d %d", &r, &c);
    int a_matrix[r][c], b_matrix[r][c];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-03
      • 2021-02-25
      • 1970-01-01
      • 2017-02-06
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多