2012-05-24 73 views
0

我在C中有一个简单的测试程序来在堆上打乱一个数组值。旁注:我知道这里的随机逻辑有一个缺陷,不允许“移位”值超过RAND_MAX,但这不是本文的要点。这个C程序为什么会崩溃?

问题是,当我运行N = 10000的代码时,每过一段时间它都会以很少的信息(下面发布的截图)崩溃。我正在使用MinGW编译器。我似乎无法重现更低或更高N值(例如1000或100000)的崩溃。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

const int N = 10000; 

int main() { 
    int i, rand1, rand2, temp, *values; 

    /* allocate values on heap and initialize */ 
    values = malloc(N * sizeof(int)); 
    for (i = 0; i < N; i++) { 
     values[i] = i + 1; 
    } 

    /* scramble */ 
    srand(time(NULL)); 
    for (i = 0; i < N/10; i++) { 
     rand1 = (int)(N*((double)rand()/(double)RAND_MAX)); 
     rand2 = (int)(N*((double)rand()/(double)RAND_MAX)); 
     temp = values[rand1]; 
     values[rand1] = values[rand2]; 
     values[rand2] = temp; 
    } 


    int displaced = 0; 
    for (i = 0; i < N; i++) { 
     if (values[i] != (i+1)) { 
      displaced++; 
     } 
    } 
    printf("%d numbers out of order\n", displaced); 

    free(values); 
    return 0; 
} 

enter image description here

回答

3

这可能是因为rand()从0产生一个随机数到RAND_MAX 包容所以(int)(N*((double)rand()/(double)RAND_MAX))可以是N,这超过了阵列的边界。然而,我不明白为什么会随着数组大小而变化(但它确实解释了为什么它有时会崩溃)。 (注意,除了双精度,避免溢出,取决于RAND_MAX的值)(虽然我不相信这将总是有效,这取决于所涉及的类型),这将对测试更安全为N并再试一次)。

另外,学习使用Is there a good Valgrind substitute for Windows?的工具 - 它们使这种事情很容易修复(它们告诉你在你运行程序时究竟出了什么问题)。

+0

D'oh,这应该是显而易见的。谢谢! – The111