我有一个简单的 C 程序,它应该用随机值填充数组(这是学校作业的开始)。我正在使用 rand(),用 srand(time()) 为其播种。因为在特定时间段内重复运行时,这往往会产生一些可预测的结果,所以我制作了另一个非常简单的函数来给我一个更随机的种子值:
time_t getRandomSeed(int numberOfIterations)
{
int i;
time_t result=time();
for (i = 0; i < numberOfIterations; i++)
{
result = randomizeSeed(result);
}
return result;
}
time_t randomizeSeed(time_t seed)
{
time_t result, fullTime, Modifier1, Modifier2;
srand((unsigned int)seed);
fullTime = time();
Modifier1 = time() >> (rand() % 10);
Modifier2 = (unsigned short)time();
Modifier2 <<= (rand() % 9 + 9);
result = fullTime ^ Modifier1 ^ Modifier2;
return result;
}
在 main 中,我在声明 2 个 int 数组后在 srand() 内调用它。当我返回main时,这些数组都是垃圾,我不明白为什么。
int main(void)
{
int randomNumbers[ARRAY_LENGTH];
int sortedNumbers[ARRAY_LENGTH];
srand((unsigned int)getRandomSeed(2));
fillArray(randomNumbers, sizeof(randomNumbers) / sizeof(randomNumbers[0]));
return 0;
}
我在第 4 行设置了一个断点,并且我有一个完全正常的单位化数组(在最近一次运行中位于 0x00e1ea70 处)。然后我在第 8 行设置了另一个断点,这样我就可以在数组被传递到 fillArray 之前看到它。此时,数组的地址不知何故为0xfffff04c,并且所有元素都显示“无法读取内存”,考虑到该地址是垃圾,我认为这是有道理的。
任何人都可以告诉我我的阵列发生了什么事吗?
*注意,这是一项学校作业,所以我并不关心 RNG 是否安全,也不能使用任何第三方库。
更新: 根据请求,这是 fillArray() 的主体。然而,从我的问题来看,问题发生在我们到达 fillArray() 之前,因为我在调用它之前设置了断点。
void fillArray(int array[], size_t length)
{
size_t i;
for (i = 0; i < length; i++)
{
array[i] = rand()%1000 + 1;
}
return;
}
最佳答案
在函数 randomizeSeed()
中,您连续调用 time()
三次,且不带参数。
fullTime = time();
Modifier1 = time() >> (rand() % 10);
Modifier2 = (unsigned short)time();
函数原型(prototype)为
time_t time(time_t *timer);
所以你应该注意你的编译器警告。从此时起,您的行为就变成了未定义。
关于调用函数后 C 数组损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29263539/