2011-12-05 51 views
0

這段代碼對於n有好處< 20,但是對於n = 40給我訪問衝突錯誤: 這段代碼會隨機填充X和O.隨機填充2d陣列

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

爲什麼不值只是隨機設置爲' X'或'O'在第一個循環中? – CanSpice

+3

我們是否也可以看到你的'arr'聲明? – Drahakar

+0

我討厭二維數組malloc。我從來沒有做對。我的猜測是,沒有任何東西強迫malloc以保持內存連續,所以它會隨機失敗。 –

回答

5

變化

arr = (char**)malloc(n); 

arr = (char**)malloc(n*sizeof(char*)); 
4

你可以這樣做: -

for(i=0;i<n;i++) 
    { 
     for(j=0;j<n;j++) 
      arr[i][j]= ((rand() % 2) == 0) ? 'O' : 'X'; 
    } 

,並確保你的陣列是N N。相反,那些多mallocs,將來自全國各地的地方分配內存...

arr = (char**)malloc(n * n * sizeof(char)); 
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*));

0

如果n是恆定的,或者你的編譯器支持C99,你可以initalize它作爲一個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