程序控制传递给函数,但函数块中的语句未执行
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;
}
程序应该显示矩阵中的最大元素。最大值应在功能块中找到。在执行该程序时,控制被传递给功能块,但没有分配值,整个块没有被执行,程序终止。这个程序有什么问题?
问题是
- 在
main()
中没有定义变量m
max = findMax((int **)a,m,n);
是错误的。如果你像这样传递它,你会得到一个 SEGFAULT。该函数需要一个指向指针的指针。二维数组与此不同。因此,将其转换为 int**
只会在您的代码后面导致分段错误。
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++)
...
#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;
}
程序应该显示矩阵中的最大元素。最大值应在功能块中找到。在执行该程序时,控制被传递给功能块,但没有分配值,整个块没有被执行,程序终止。这个程序有什么问题?
问题是
- 在
main()
中没有定义变量 max = findMax((int **)a,m,n);
是错误的。如果你像这样传递它,你会得到一个 SEGFAULT。该函数需要一个指向指针的指针。二维数组与此不同。因此,将其转换为int**
只会在您的代码后面导致分段错误。for(i=1;i<=m;i++)
和for(j=1;j<=n;j++)
会跳过数组的很多元素(会跳过第一个元素以上,即会跳过a[0][some other index]
处的所有值和a[some index][0]
).
m
因此,您应该将函数更改为
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++)
...