【发布时间】:2022-11-17 00:43:20
【问题描述】:
我不明白为什么 rand() 函数返回如此荒谬的整数。前 4 个生成的数字似乎没问题,但它们之后发生了什么?
有代码片段:
int i=0, j=0;
int tab[4][3];
srand(time(0));
for(i;i<=3;i++) {
for(j;j<=2;j++) {
tab[i][j] = rand() % 50;
}
}
for(i=0;i<=3;i++) {
for(j=0;j<=2;j++) {
printf("%d\t", tab[i][j]);
}
printf("\n");
}
输出是:
16 31 24
24 65535 -1068880744
-1068880744 65535 1358574848
1358574848 1323076347 -1068880848
【问题讨论】:
-
发布一个正确的minimal reproducible example。据我们所知,您正在破坏阵列。 (并且根据那些循环无意义的初始值设定项和上限来判断,这可能是一个很好的猜测。
-
第一个循环不会每次通过
i循环都将j重置为0。所以它只填充表的第 0 行(假设你在循环之前有i = 0。 -
使用
<=作为数组的循环条件通常是不正确的。此外,您永远不会初始化i和j成员(在您显示的代码中),因此它们可能具有不确定(“垃圾”)值。 -
正如其他 cmet 所说,像
for(i;i<=3;i++)这样的循环是双重错误的。你几乎肯定想要for(i = 0; i < 3; i++)。 C 中的数组是从 0 开始的,所以如果某处有int tab[3][2],您希望i取值0、1、2和j取值 @987654339 @,1。 -
和全部输出看起来是假的。
rand() % 2的计算结果为0或1,但打印的结果都不是这些值中的任何一个。