那个c代码有什么问题?

时间:2015-04-28 16:43:49

标签: c pointers matrix

#include<stdio.h>
int findMax(int **a,int m,int n)
{
  int max,i,j;
  max=a[0][0];
  for(i=0;i<m;i++)
  for(j=0;j<n;j++)
  if(max<a[i][j])
    max=a[i][j];
  return max;
}
int main()
{
  int a[20][20],m,n,i,j,maxim;
  scanf("%d",&m); //Rows
  scanf("%d",&n); //Cols
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
     scanf("%d",&a[i][j]);
  maxim=findMax((int **)a,m,n);
 printf("Max is %d\n",maxim);
 return 0;
}

上面的代码必须在输入矩阵中给出最大元素。

问题
编译代码时,我没有收到任何错误或警告,但在执行期间代码在输入后停止运行。!

问题陈述说必须使用 int findMax(int ** a,int m,int n)

3 个答案:

答案 0 :(得分:4)

2D数组不会衰减为指向指针的指针。使用:

  maxim=findMax((int **)a,m,n);

你强迫编译器忽略你的错误。

而不是

int findMax(int **a,int m,int n)

使用

int findMax(int a[][20],int m,int n)

然后,只需使用:

调用该函数
  maxim=findMax(a,m,n);

你说:

  

问题陈述说必须使用 int findMax(int ** a,int m,int n)

在这种情况下,您无法将{2}数组用于a。你必须使用:

int main()
{
   // Define a to be an array of pointers.
   int* a[20];
   int m,n,i,j,maxim;

   scanf("%d",&m); //Rows

   // Make sure m not greater than 20. Otherwise, you'll end up
   // accessing memory out of bounds.
   if ( m > 20 )
   {
      // Deal with error.
   }

   scanf("%d",&n); //Cols

   for(i=0;i<m;i++)
   {
      a[i] = malloc(sizeof(int)*n);
      for(j=0;j<n;j++)
      {
         scanf("%d",&a[i][j]);
      }
   }

   maxim=findMax(a,m,n);
   printf("Max is %d\n",maxim);

   // Deallocate memory.
   for(i=0;i<m;i++)
   {
      free(a[i]);
   }

   return 0;
}

答案 1 :(得分:1)

int findMax(int **a,int m,int n)

应该是

int findMax(int a[][20],int m,int n)

检查以下代码。通过使a指向指针,您就可以使用API​​的原型

int main()
{
  int **a,m,n,i,j,maxim;
  scanf("%d",&m); //Rows
  scanf("%d",&n); //Cols
  a =  malloc(sizeof(int *) * m);
  for(i=0;i<m;i++)
  {
    a[i] = malloc(sizeof(int) * n);
   for(j=0;j<n;j++)
     scanf("%d",&a[i][j]);
  }
  maxim=findMax((int **)a,m,n);
 printf("Max is %d\n",maxim);
 return 0;
}

答案 2 :(得分:1)

而不是int a[20][20],请使用int **a并分配其空间。

int a1[20][20]a1声明为int的数组20的数组20 int **a2a2声明为指向int的指针 @Ref

a1int的二维数组 a2是指针数组。 a2[i]指向int(或int数组中的第一个) 这两种类型相似,但不兼容。

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

int main(void) {
  int m, n, i, j, maxim;
  int **a;

  scanf("%d", &m); //Rows
  scanf("%d", &n); //Cols
  a = calloc(m, sizeof *a);
  if (a == NULL)
    return EXIT_FAILURE;
  for (i = 0; i < m; i++) {
    a[i] = calloc(n, sizeof *a[i]);
    if (a[i] == NULL)
      return EXIT_FAILURE;
    for (j = 0; j < n; j++) {
      scanf("%d", &a[i][j]);
    }
  }

  maxim = findMax(a, m, n);
  printf("Max is %d\n", maxim);

  for (i = 0; i < m; i++) {
    free(a[i]);
  }
  free(a);
  return 0;
}