2012-05-24 107 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