问题描述
#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;
}