C 需要使用一些函数查找和打印2D数组行的平均值吗

C 需要使用一些函数查找和打印2D数组行的平均值吗,c,arrays,C,Arrays,所以我试图制作一个程序,用随机数创建一个2d数组,然后用函数打印出来 之后,我需要打印出2d数组中每一行的平均值,所以我想我将创建另一个数组并输入每一行的平均值,然后打印名为avgLine[]的平均数组 这段代码不会返回任何错误,但是当我在打印2d数组后尝试运行它时,程序崩溃了,我需要帮助使它正常工作 #include <stdio.h> #include <stdlib.h> #define nmax 100 //creates a 2d array and fill

所以我试图制作一个程序,用随机数创建一个2d数组,然后用函数打印出来

之后,我需要打印出2d数组中每一行的平均值,所以我想我将创建另一个数组并输入每一行的平均值,然后打印名为
avgLine[]
的平均数组

这段代码不会返回任何错误,但是当我在打印2d数组后尝试运行它时,程序崩溃了,我需要帮助使它正常工作

#include <stdio.h>
#include <stdlib.h>
#define nmax 100

//creates a 2d array and fills it with random numbers//
void fillPin2D(int n,int p[][nmax]){
    int i,j;
    for(i=0;i<n;i++){
     for(j=0;j<n;j++){
      p[i][j]=rand() % 11;
     }
    }
}

//prints out the 2d array//
void showPin2D(int n,int p[][nmax]){
    int i,j;
 for(i=0;i<n;i++){
  for(j=0;j<n;j++){
    printf("%d ",p[i][j]);

  }
 printf("\n"); }
}

//finds the average for every row and inserts it in a new array called avgLine[]//
void findMeanLine(int n,int p[][nmax]){
    int sum,i,j;
    double avg,avgLine[i];
    for(i=0;i<n;i++){
       sum=sum+p[i][nmax];
     for(j=0;j<n;j++){
     }
    }
    avg=sum/n;
    avgLine[i]=avg;

}

//prints out the avgLine array//
int showPinDouble1D(int n,double avgLine[]){
    int i;
 for(i=0;i<n;i++){
  printf("%lf",avgLine);
 }
}

main(){
   int n,i;
//here is a check so the program accepts integers > 5//
   do{
    printf("Give integer n > 5 : ");
    scanf("%d",&n);
   }while (n<5);
    int p[n][nmax];
    fillPin2D(n,p);
    printf("p = \n");
    showPin2D(n,p);
    findMeanLine(n,p);
    double avgLine[i];
    printf("p = \n");
    showPinDouble1D(n,avgLine);
    system("Pause");

}
#包括
#包括
#定义nmax 100
//创建二维数组并用随机数填充//
void fillPin2D(int n,int p[][nmax]){
int i,j;

对于(i=0;i而言,发布的代码中存在多个错误,大多数错误可由编译器检测到,具有适当的警告级别(例如,请参阅诊断),并且源于对内存分配和作用域变量生存期的误解

制作一个用随机数创建二维数组的程序

在检索大小
n
之后,(这里我将忽略OP的方法),数组声明为

int p[n][nmax];  // Where nmax was previously defined as 100
假设在下面的示例中,数组始终被视为平方矩阵,那么最好将可变长度数组声明为

int p[n][n];
在这种情况下,所有函数签名都必须更改为

// prints out the 2d array
void showPin2D(int n, int p[][n]) { /* ... */ }
//                            ^
然而,主要的问题是计算平均值。在
main
中,声明了一个大小未知的数组,并将其传递给打印它的函数

double avgLine[i];  // Where 'i' has an undetermined value, beeing uninitialized.
但在函数
findMeanLine
中,它从未被初始化或修改,其中以某种方式使用了同名的局部变量

void findMeanLine(int n,int p[][nmax]) {
    int sum,i,j;              // Uninitialized variables, their values are undeterminated
    double avg, avgLine[i];   // Both are local, invisible to the outside
    for(i=0;i<n;i++) {
       sum=sum+p[i][nmax];    // It shouldn't be here and `nmax` is wrong
       for(j=0;j<n;j++) {     // It literally does nothing
       }  
    }
    avg = sum / n;            // Useless
    avgLine[i] = avg;         // Now 'i' is equal to `n`, so this would be an out of bounds access
}

联机编译器给出一些错误:您应该尝试修复它们
double avgLine[i];
此处
i
未初始化。启用所有编译器警告并读取它们。
avgLine[i]=avg;
此行应位于for循环内。另外
sum=sum+p[i][nmax
这是未定义的行为请注意,生成的程序集为posted
findMeanLine
函数启用了优化:
avg
avgLine
都是局部变量,它们不会超出其作用域。
// in main:
// ...
double avgLine[n];
findMeanLine(n, p, avgLine);
showPinDouble1D(n, avgLine);
// ...

// Finds the average for every row and inserts it in a new array called 'avgLine'
void findMeanLine(int n,int p[][n], avgLine[])
{
    for(int i = 0; i < n; i++)
    {
       // The average of every line, so reset the sum every time...
       int sum = 0;              
       for(int j = 0; j < n; j++)
       {
           sum += p[i][j];
           //         ^^^ 
       }
       avgLine[i] = (double)sum / n; // We want a real division, not an integer one.
    }
}