2011-12-05 5 views
0

このコードはn <に適していますが、n = 40ではアクセス違反エラーが発生します: このコードはXとOをランダムに埋めます。2次元配列をランダムに塗りつぶします

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

男私は2D配列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個であることを確認してください。代わりの場所ですべてのメモリを割り当てます、これらの複数のmallocを、...

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*nの? arrnの要素のみを持ち、arr[0...n-1]はそれぞれnの要素しか持っていません。 xまたはy>= nの場合、配列の末尾にある要素にアクセスして、未定義の動作が発生します。この場合は、アクセス違反の原因となるため、あなたの幸運です。

これとarr = (char**)malloc(n);は、arr = (char**)malloc(n * sizeof(char*));である必要があります。

0

nが一定である、またはあなたのコンパイラは、その後、1-Dとして、それをinitalizeへのポインタの配列にキャストすることができ、C99をサポートしている場合:ちょうどランダム `に値を設定しないのはなぜ

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 
関連する問題