程序控制传递给函数,但函数块中的语句未执行

Program control passed to function, but the statements in the function block doesn't get executed

#include<stdio.h>

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

int main()
{
    int n;
    int a[20][20];
    int i, j, max;
    printf("\nEnter the number of rows in the array");
    scanf("%d", &m);
    printf("\nEnter the number of columns in the array");
    scanf("%d", &n);
    printf("\nEnter the elements of the matrix");
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d", a[i][j]);
        }
        printf("\n");
    }
    printf("\nThe matrix is\n");
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
         printf("%d", a[i][j]);
        }
        printf("\n");
    }
    max = findMax((int **)a, m, n);
    printf("\nThe maximum element in the matrix is %d", max);
    return 0;
}

int findMax(int **a, int m, int n)
{
    int i, j, max;
    max = a[0][0];
    for(i=1; i<=m; i++)
    {
        for(j=1; j<=n; j++)
        {
            if(a[i][j] > max)
                max = a[i][j];
        }
    }
    return max;
}

程序应该显示矩阵中的最大元素。最大值应在功能块中找到。在执行该程序时,控制被传递给功能块,但没有分配值,整个块没有被执行,程序终止。这个程序有什么问题?

问题是

  1. main()
  2. 中没有定义变量m
  3. max = findMax((int **)a,m,n); 是错误的。如果你像这样传递它,你会得到一个 SEGFAULT。该函数需要一个指向指针的指针。二维数组与此不同。因此,将其转换为 int** 只会在您的代码后面导致分段错误。
  4. for(i=1;i<=m;i++)for(j=1;j<=n;j++)会跳过数组的很多元素(会跳过第一个元素以上,即会跳过a[0][some other index]处的所有值和 a[some index][0] ).

因此,您应该将函数更改为

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

并用

调用它
max = findMax(a,m,n);

并将那些 for 循环更改为正常循环,例如

for(i=0;i<m;i++)
for(j=0;j<n;j++)

这是您的代码的有效实现

#include<stdio.h>
int findMax(int a[][20],int m,int n);
int main()
{
  int n,m;
  int a[20][20];
  int i,j,max;
  printf("\nEnter the number of rows in the array");
  scanf("%d", &m);
  printf("\nEnter the number of columns in the array");
  scanf("%d", &n);
  printf("\nEnter the elements of the matrix\n");
  for(i=0;i<m;i++)
  {
    for(j=0;j<n;j++)
    {
      scanf("%d", &a[i][j]);
    }
  }
  printf("\nThe matrix is\n");
  for(i=0;i<m;i++)
  {
    printf("\n");
    for(j=0;j<n;j++)
    {
      printf("%d\t", a[i][j]);
    }
  }
  max = findMax(a,m,n);
  printf("\nThe maximum element in the matrix is : %d", max);
  return 0;
}

int findMax(int a[][20],int m,int n)
{
  int i,j,max;
  max = a[0][0];
  for(i=0;i<m;i++)
  {
    for(j=0;j<n;j++)
    {
      if(a[i][j] > max)
        max = a[i][j];
    }
  }
  return max;
}

这段代码有很多问题:

int findMax(int **a,int m,int n)
{
 int i,j,max;
 max = a[0][0];
 for(i=1;i<=m;i++)
 {
  for(j=1;j<=n;j++)
  {
   if(a[i][j] > max)
      max = a[i][j];
  }
 }
 return max;
}

从原型开始,int ** 声明您正在传递一个指向 int 指针的指针 - 也称为 int 指针数组。这将被声明为

int * a[n];

那和int的二维数组不一样。

由于您的数组 a 被声明为具有固定大小 (20 x 20),因此原型应该是

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

现在编译器知道如何正确索引它并为单个元素(例如 a[0][0]

提供正确的类型

接下来,C 使用从零开始的数组 - 您通过语句 max = a[0][0] 确认这一点,但您的循环会忽略第零行和第零列,同时索引数组的末尾到第 m 和第 n 个条目.

他们需要

for (i=0; i < m; i++)
    for (j = 0; j< m; j++)
        ...