2012-12-05 76 views
1

我有一個素數生成器,它生成unsigned int count素數並將它們存儲在一個全局聲明的動態分配數組中numList globalPrimes numList只是typedef unsigned int *numList。如果計數的值是0,它被忽略,直到先前計算方法爲質數的值超過unsigned int until其忽略,除非數爲0奇怪的realloc行爲奇/偶netbeans

numList getPrimes(unsigned int count, unsigned int until) 
{ 
    unsigned int i, j; 
    unsigned int p = 0; 
    char b=1; 
    if(globalPrimes==NULL) 
    { 
     b=0; 
     globalPrimes = calloc(count>0? count:until, sizeof(int)); 
     if(globalPrimes==NULL) 
     return NULL; 
    } 
    globalPrimes[0]=2; //set first 2 prime #'s in list 
    globalPrimes[1]=3; 
    for(i=2, p=5; count!=0? (i<count):(globalPrimes[i-1]<=until); p+=2) //iterate until it finds every prime number. Increments p by 2 starting from the third prime 
    { 
     if(globalPrimes[i]!=0) //if the current prime was preordained (a value was set already) skip to the next prime 
     { 
      p=globalPrimes[i++]; 
      continue; 
     } 
     else if(globalPrimes[i]==0) //if it is 0, allocate the extra memory and find next prime 
     { 
      if(b) 
       globalPrimes=(numList)realloc((void *)globalPrimes, sizeof(int)*((count==0)? (until):(count+1))); 
      b=0; 
     } 

     for(j=0; (p%globalPrimes[j]) && globalPrimes[j]*globalPrimes[j]<p; j++); //loop through all previous primes until past half of p 
     if(p%globalPrimes[j]) //if the prime is still not divisible by the previous prime 
      globalPrimes[i++]=p; // save as the next prime 
    } 
    globalPrimes[i]=0; 
    globalPrimes=(numList)realloc((void *)globalPrimes, (i+(i%2)+1)*sizeof(int)); 
    return globalPrimes; 
} 

在一些測試中,它計算質數,我發現了一個奇怪的錯誤。在與realloc netbean(gcc編譯器)的倒數第二行給我一個「信號」,我認爲它就像運行時異常。對話框顯示錯誤是SIGABRT,並且它在不處於調試模式時中止程序。我發現這個錯誤只發生在count爲奇數時。即使我修改realloc的參數以使它始終傳遞偶數,仍然存在錯誤。但是,當我修改計數只是在函數的開始,它工作正常。我無法弄清楚爲什麼這個奇怪的細節會導致這種奇怪的行爲。

+0

[valgrind](http://valgrind.org/)是你的朋友。 –

+0

調試器?解釋 – bathtub

+1

你傳遞給'getPrimes'的參數是什麼? (我正在測試這個) – Xymostech

回答

1

globalPrimes[i]=0; 

只是你的最後realloc()被破壞內存之前 - 這是這只是過去你分配的數組的結尾寫。

我想你要分配陣列像這樣:

globalPrimes = calloc(count>0? (count + 1):until, sizeof(int)); 

到目前爲止,我只看到在函數調用非零count的情況;我真的不知道如果使用count == 0until作爲某個目標素數調用函數時可能會出現什麼問題。

+0

謝謝。我甚至不知道爲什麼我沒有注意到這一點。 – bathtub

+0

我試着編譯並運行VS 2012下的函數來查看調試CRT是否會發現錯誤。我很驚訝地發現它沒有(調用'free()'而不是'realloc()'確實會注意到這種損壞)。我已經在connect.microsoft.com上打開了一個關於這種行爲的錯誤 - 我認爲''realloc()'的調試版本應該注意到錯誤的寫入。 –