c - 警告:函数的指针参数可以未初始化使用

时间:2015-10-01 23:27:00

标签: c

     #include <stdio.h>
 #include <stdlib.h>

void multiplyMatrix (int **first, int **second, int **multiply);
int m, n, p, q, i, c, d, k, sum = 0;
int main()
{
  int **first, **second, **multiply;

  printf("Enter the number of rows and columns of first matrix\n");
  scanf("%d%d", &m, &n);
  first = (int **) malloc(m * sizeof(int *));
    for(i = 0 ; i < n ; i++){

        first[i]=(int *)malloc(m * sizeof(int *));
  }
  printf("Enter the elements of first matrix\n");

  for (c = 0; c < m; c++)
    for (d = 0; d < n; d++)
      scanf("%d", &first[c][d]);

  printf("Enter the number of rows and columns of second matrix\n");
  scanf("%d%d", &p, &q);
  second = (int **) malloc(p * sizeof(int *));
    for(i = 0 ; i < q ; i++){

        second[i]=(int *) malloc(p * sizeof(int *));
  }
  if (n != p)
    printf("Matrices with entered orders can't be multiplied with each other.\n");
  else
  {
    printf("Enter the elements of second matrix\n");

    for (c = 0; c < p; c++)
      for (d = 0; d < q; d++)
        scanf("%d", &second[c][d]);

    /*for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++) {
        for (k = 0; k < p; k++) {
          sum = sum + first[c][k]*second[k][d];
        }

        multiply[c][d] = sum;
        sum = 0;
      }
    }*/
    multiplyMatrix(first, second, multiply);
    printf("Product of entered matrices:-\n");

    for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++)
        printf("%d\t", multiply[c][d]);

      printf("\n");
    }
  }

  return 0;
}

void multiplyMatrix (int **first, int **second, int **multiply)
{

    for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++) {
        for (k = 0; k < p; k++) {
          sum = sum + first[c][k]*second[k][d];
        }

        multiply[c][d] = sum;
        sum = 0;
      }
    }
}

我想写的程序应该是这样的:程序要求用户输入2个矩阵的大小和元素(或者你可以称之为2d数组)。然后它将乘以那些矩阵并打印出答案。

我得到的问题:我使用指针和malloc函数来动态分配矩阵。为了乘法,我创建了一个名为&#34; multiplyMatrix&#34;的函数。我得到了一个警告,其中的一个论点在decleration。这是警告:

警告:&#39;乘以&#39;可以在此功能中使用未初始化。

因此初始化此参数存在某种问题。我觉得答案很简单,但与此同时我无法找到解决方案。

3 个答案:

答案 0 :(得分:1)

您尚未分配乘法矩阵使用的内存 - 因此它被标记为未初始化。

您还需要在分配第一个和第二个矩阵时查看如何使用行和列值,例如:

  first = (int **) malloc(m * sizeof(int *));
    for(i = 0 ; i < m ; i++){

        first[i]=(int *)malloc(n * sizeof(int *));
  }

(包含wildplasser发表的评论)

这将允许首先作为第一[row] [col]

进行访问

答案 1 :(得分:0)

变量multiply在main()中声明,但它永远不会指向任何东西。它需要以与firstsecond相同的方式创建,但它不需要具有&#39;填写的值。

答案 2 :(得分:0)

改进代码的建议:

  1. 创建一个为矩阵分配内存的函数。
  2. 创建一个读取矩阵数据的函数。
  3. 创建一个函数来释放矩阵的内存。
  4. 避免使用全局变量。将必要的参数传递给函数。
  5. 使用这些功能而不是复制main中的代码。
  6. #include <stdio.h>
    #include <stdlib.h>
    
    int** createMatrix(int rows, int cols)
    {
       int i;
       int** mat = malloc(sizeof(*mat)*rows);
       for ( i = 0; i < rows; ++i )
          mat[i] = malloc(sizeof(*mat[i])*cols);
    
       return mat;
    }
    
    void readMatrix(int** mat, int rows, int cols)
    {
       int r;
       int c;
       for ( r = 0; r < rows; ++r )
          for ( c = 0; c < cols; ++c )
             scanf("%d", &mat[c][c]);
    }
    
    void deleteMatrix(int** mat, int rows)
    {
       int i;
       for ( i = 0; i < rows; ++i )
          free(mat[i]);
       free(mat);
    }
    
    void multiplyMatrix (int **first, int **second, int **multiply,
                         int frows, int fcols, int scols)
    {
       int sum = 0;
       int r;
       int c;
       int k;
    
       for (r = 0; r < frows; r++) {
          for (c = 0; c < scols; c++) {
             sum = 0;
             for (k = 0; k < fcols; k++) {
                sum += first[r][k]*second[k][c];
             }
    
             multiply[r][c] = sum;
          }
       }
    }
    
    int main()
    {
       int m, n, p, q;
       int r, c;
       int **first, **second, **multiply;
    
       printf("Enter the number of rows and columns of first matrix\n");
       scanf("%d%d", &m, &n);
    
       first = createMatrix(m, n);
    
       printf("Enter the elements of first matrix\n");
       readMatrix(first, m, n);
    
    
       printf("Enter the number of rows and columns of second matrix\n");
       scanf("%d%d", &p, &q);
    
       if (n != p)
          printf("Matrices with entered orders can't be multiplied with each other.\n");
       else
       {
          second = createMatrix(p, q);
    
          printf("Enter the elements of second matrix\n");
          readMatrix(second, p, q);
    
          multiply = createMatrix(m, q);
    
          multiplyMatrix(first, second, multiply, m, n, q);
          printf("Product of entered matrices:-\n");
    
          for (r = 0; r < m; r++) {
             for (c = 0; c < q; c++)
                printf("%d\t", multiply[r][c]);
    
             printf("\n");
          }
    
          deleteMatrix(multiply, m);
          deleteMatrix(second, p);
       }
    
       deleteMatrix(first, m);
    
       return 0;
    }