随机填充2d数组

时间:2011-12-05 22:52:11

标签: c++ c

这个代码适用于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);

4 个答案:

答案 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*narr只有n个元素,而arr[0...n-1]每个元素只有n个元素。如果xy>= 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