调用函数后C数组被破坏

时间:2015-03-25 18:22:44

标签: c arrays random

我有一个简单的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行设置断点,并且我有一个完全正常的unititialized数组(在最近的运行中为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;
}

1 个答案:

答案 0 :(得分:0)

在你的函数randomizeSeed()中,你连续三次调用time()而没有争论。

fullTime = time();
Modifier1 = time() >> (rand() % 10);
Modifier2 = (unsigned short)time();

函数原型是

time_t time(time_t *timer);

所以你应该注意你的编译器警告。从现在开始,您有未定义的行为。