这个代码适用于n <20,但是对于n = 40,我给出了访问冲突错误: 此代码将随机填充X和O.
int i=0,j=0;
int x=0,y=0;
int n=40;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
arr[i][j]='O';
}
srand(clock());
for(i=0;i<n*n;i++)
{
x = rand()%n;
y = rand()%n;
if(arr[x][y] == 'O') arr[x][y]='X';
}
宣告:
arr = (char**)malloc(n);
for(i=0;i<n;i++)
arr[i] = (char*)malloc(n);
答案 0 :(得分:5)
变化
arr = (char**)malloc(n);
到
arr = (char**)malloc(n*sizeof(char*));
答案 1 :(得分:4)
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
arr[i][j]= ((rand() % 2) == 0) ? 'O' : 'X';
}
并确保您的数组是n乘n。而不是那些将从所有地方分配内存的多个malloc ...
arr = (char**)malloc( n * n * sizeof(char));
答案 2 :(得分:1)
for(i=0;i<n*n;i++)
{
x = rand()%n;
y = rand()%n;
if(arr[x][y] == 'O') arr[x][y]='X';
...
n*n
? arr
只有n
个元素,而arr[0...n-1]
每个元素只有n
个元素。如果x
或y
为>= n
,您将访问数组末尾的元素并导致未定义的行为。在这种情况下,你很幸运,因为它会导致访问冲突。
那,arr = (char**)malloc(n);
应为arr = (char**)malloc(n * sizeof(char*));
。
答案 3 :(得分:0)
如果n是常量,或者你的编译器支持C99,你可以将它作为1-d进行初始化,然后将其转换为指针数组:
int i;
char (*arr)[n] = malloc(n*n);
char *vals = (char*)arr;
for(i=0; i<n*n; i++)
vals[i] = (rand()%2)?'X':'O';
//now, use arr[y][x] as usual