这段代码对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);发布于 2011-12-06 07:02:04
变化
arr = (char**)malloc(n);至
arr = (char**)malloc(n*sizeof(char*));发布于 2011-12-06 07:01:31
你可以这样做:
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
arr[i][j]= ((rand() % 2) == 0) ? 'O' : 'X';
}并确保你的数组是n乘以n。而不是那些多个错误定位,这将分配来自所有地方的内存…
arr = (char**)malloc( n * n * sizeof(char));发布于 2011-12-06 07:04:14
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*));。
https://stackoverflow.com/questions/8393049
复制相似问题