尝试制作 2x2 网格时出现分段错误

Segmentation fault while trying to make 2x2 grid

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

void initialization(int n, int grid[n][n]){
  srand(time(0));
  for(int i = 0 ; i < n; i++){
    int no1 = 0, no0 = 0;
    for(int j = 0; j < n; j++){
      int checker = rand();
      if(no1 != n/2 && no0 != n/2){
        if(checker % 2 == 0){
          grid[i][j]=1;
          no1++;
        }
        else{
          grid[i][j]=0;
          no0++;
        }
      }
      else if(no1 != n/2 && no0 == n/2){
        grid[i][j]=1;
        no1++;
      }
      else if(no1 == n/2 && no0 != n/2){
        grid[i][j]=0;
        no0++;
      }
    }
  }
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
      printf("%d", grid[i][j]);
    }
    printf("\n");
  }
}

int main() {
  int n;
  printf("Enter an even number between [2,80]: ");
  scanf("%d",n);
  if(n % 2 == 1){
    return 1;
  }
  
  int grid[n][n];
  
  initialization(n, &grid);
  return 0;
}

这就是我想要做的:我试图让用户输入一个偶数值,然后制作一个 nxn 网格。这个 nxn 网格应该在每一行中有随机数的 n/2 个 1 和 0。但出于某种原因,每次我 运行 这段代码都会出现分段错误

  • scanf("%d",n); 调用了 未定义的行为 以传递错误类型的数据并使用具有自动存储持续时间的未初始化变量的值,这是不确定的。添加 &scanf("%d",&n); 以将 指针传递给 n.
  • initialization(n, &grid); 的第二个参数类型错误。删除 & 以传递 grid,这将转换为 int(*)[2]

您的 main 函数应该是:

int main() {
  int n;
  printf("Enter an even number between [2,80]: ");
  scanf("%d",&n);
  if(n % 2 == 1){
    return 1;
  }
  
  int grid[n][n];
  
  initialization(n, grid);
  return 0;
}

同时检查 scanf() 的 return 值以检查它是否成功,这样将进一步改进您的代码:

int main() {
  int n;
  printf("Enter an even number between [2,80]: ");
  if(scanf("%d",&n) != 1){
    fputs("read error\n", stderr);
    return 1;
  }
  if(n % 2 == 1){
    return 1;
  }
  
  int grid[n][n];
  
  initialization(n, grid);
  return 0;
}