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

问题描述

#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);调用了 undefined behavior ,用于传递错误类型的数据并使用具有自动存储持续时间(不确定)的未初始化变量的值。像&一样添加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()的返回值以检查它是否成功,这样可以进一步改善代码:

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;
}