【发布时间】:2013-09-12 18:02:20
【问题描述】:
我被要求编写一个生成 2d 随机数数组的程序。我的代码产生了奇怪的结果。不管矩阵的大小如何,它都会产生一个“反向对角矩阵”(不知道还能叫什么)。我要理解 rand() 会产生一个介于 0 和 RAND_MAX 之间的伪随机数,但不知何故,结果取决于我的矩阵的大小,我不确定这种行为是如何发生的。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAT_SIZE 5
void main (void)
{
srand(time(0));
unsigned char * ptr = malloc(MAT_SIZE*MAT_SIZE);
unsigned char i, j;
for(i = 0; i < MAT_SIZE; i++)
{
for(j = 0; j < MAT_SIZE ; j ++)
{
*(ptr + i + j ) = rand();
}
}
for(i = 0; i < MAT_SIZE ; i++)
{
for(j = 0; j < MAT_SIZE ; j ++)
{
printf("%5d", *(ptr + i + j));
}
printf("\n");
}
free(ptr);
}
3*3 的输出
142 141 11
141 11 230
11 230 28
5*5 的输出
232 157 62 131 245
157 62 131 245 54
62 131 245 54 138
131 245 54 138 246
245 54 138 246 108
即使是伪随机数也不应该因使用方式而异。我对导致这些结果的程序有什么不明白的地方吗?
【问题讨论】:
-
如果您不分配内存块并尝试将矩阵映射到其中,而是直接声明并使用矩阵,您的代码会简单得多:即
int matrix[MAT_SIZE][MAT_SIZE]; -
*(ptr + i + j) ==> *(p[i]+j)
-
不,gangadhar,这是一个段错误。
p[i]是一个字符,而不是一个指针。 -
@Ferruccio,您应该将其详细说明为答案。不幸的是,仍然有很多代码向初学者出售这种二维数组的“仿真”,而不是从一开始就教他们正确的东西。