【问题标题】:Segmentation fault while trying to make 2x2 grid尝试制作 2x2 网格时出现分段错误
【发布时间】:2021-01-18 08:26:17
【问题描述】:
#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。但由于某种原因,每次我运行这段代码时都会出现分段错误

【问题讨论】:

  • main 中替换 scanf("%d",n);by scanf("%d",&amp;n);initialization(n, &amp;grid);initialization(n, grid); => 投票关闭“错字”
  • 第二个问题是由 gcc 发出的,即使没有选项,这两个问题也是由 gcc 使用选项-Wall 发出的,我鼓励你始终使用该选项并考虑警告,这些警告对纠正您的代码有很大帮助

标签: c gcc c99


【解决方案1】:
  • scanf("%d",n); 调用 未定义的行为 以传递具有错误类型的数据并使用具有自动存储持续时间的未初始化变量的值,这是不确定的。添加&amp; 就像scanf("%d",&amp;n); 一样将指针传递给 n
  • initialization(n, &amp;grid); 的第二个参数类型错误。删除&amp; 传递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;
}

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2021-12-19
    • 1970-01-01
    • 2015-08-27
    • 2023-03-11
    • 1970-01-01
    • 2018-09-24
    • 2016-07-25
    • 2013-07-23
    相关资源
    最近更新 更多