调用函数后 C 数组损坏
C array corrupted after calling a function
我有一个简单的 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;
}
主要是,我在声明 2 个 int 数组后在 srand() 中调用它。当我 return 到 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,所有元素都显示 "unable to read memory",鉴于地址是垃圾,我想这是有道理的。
任何人都可以告诉我阵列发生了什么事吗?
*注意,这是为了学校作业,所以我真的不在乎 RNG 是否安全,我也不能使用任何第 3 方库。
更新:
根据请求,这是 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();
函数原型是
time_t time(time_t *timer);
所以你应该注意你的编译器警告。从这一点开始,你有未定义的行为。
我有一个简单的 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;
}
主要是,我在声明 2 个 int 数组后在 srand() 中调用它。当我 return 到 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,所有元素都显示 "unable to read memory",鉴于地址是垃圾,我想这是有道理的。
任何人都可以告诉我阵列发生了什么事吗?
*注意,这是为了学校作业,所以我真的不在乎 RNG 是否安全,我也不能使用任何第 3 方库。
更新: 根据请求,这是 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();
函数原型是
time_t time(time_t *timer);
所以你应该注意你的编译器警告。从这一点开始,你有未定义的行为。