2016-01-07 96 views
0

我想構建和運行下面的代碼塊上的代碼,但它崩潰並返回(0xC0000005)錯誤。我主要懷疑在gCRSF_gibbs函數中使用realloc指針n_k,但是我不確定如何跟蹤崩潰的來源。這不是我的原始代碼,我也是C中的noob。任何幫助都會被讚賞。Code :: Blocks崩潰:進程返回(0xC0000005)

#include <stdio.h> 
#include "string.h" 
#include <math.h> 
#include <stdlib.h> 
int BinarySearch(double probrnd, double *prob_cumsum, int Ksize) { 
int k, kstart, kend; 
if (probrnd <=prob_cumsum[0]) 
    return(0); 
else { 
    for (kstart=1, kend=Ksize-1; ;) { 
     if (kstart >= kend) { 
      return(kend); 
     } 
     else { 
      k = kstart+ (kend-kstart)/2; 
      if (prob_cumsum[k-1]>probrnd && prob_cumsum[k]>probrnd) 
       kend = k-1; 
      else if (prob_cumsum[k-1]<probrnd && prob_cumsum[k]<probrnd) 
       kstart = k+1; 
      else 
       return(k); 
     } 
    } 
} 
return(k);} 
void gCRSF_gibbs(double *z, double *n_k, double *SampleDex, 
      double *r, double *a, double *p, 
      int *Ksize, int *WordNum) { 

int i, j, k; 
double mass; 

double *prob_cumsum; 
double cum_sum, probrnd; 
void *newptr; 

prob_cumsum = (double *) calloc(Ksize[0],sizeof(double)); 

mass = r[0]*pow(p[0],-a[0]); 
for (i=0;i<WordNum[0];i++){ 
    j = (int) SampleDex[i] -1; 
    k = (int) z[j] -1; 
    if(z[j]>0){ 
     n_k[k]--; 
    } 
    for (cum_sum=0, k=0; k<Ksize[0]; k++) { 
     cum_sum += n_k[k]-a[0]; 
     prob_cumsum[k] = cum_sum; 
    } 

    if (((double) rand()/RAND_MAX * (cum_sum + mass) < cum_sum)){ 
     probrnd = (double)rand()/(double)RAND_MAX*cum_sum; 
     k = BinarySearch(probrnd, prob_cumsum, Ksize[0]); 
    } 
    else{ 
     for (k=0; k<Ksize[0]; k++){ 
      if ((int) n_k[k]==0){ 
       break; 
      } 
     } 
     if (k==Ksize[0]){ 
      Ksize[0]++; 
      newptr = realloc(n_k,sizeof(*n_k)*Ksize[0]); 
      n_k = newptr; 
      n_k[Ksize[0]-1]=0; 
      prob_cumsum = realloc(prob_cumsum,sizeof(*prob_cumsum)*Ksize[0]); 
     } 
    } 
    z[j] = k+1; 
    n_k[k]++; 
} 
free(prob_cumsum);} 

int main() { 
double *z, *n_k, *sampleDex; 
double *r, *a, *p; 
int *Ksize, *WordNum; 
z[0]=1;z[1]=1;z[2]=2;z[3]=0;z[4]=0; 
n_k[0]=2;n_k[1]=1; 
sampleDex[0]=4;sampleDex[1]=5; 
r[0]=5;a[0]=0.5;p[0]=0.5; 
Ksize[0]=2;WordNum[0]=2; 
gCRSF_gibbs(z,n_k,sampleDex,r,a,p,Ksize,WordNum); 
return 0;} 
+0

您的代碼不僅格式嚴重,而且使用了許多可疑的做法。你的變量'r','a'和'p'是標量,而不是數組;像對待他們一樣。你嘗試重新分配一個按值傳遞給函數的數組,這不是一個好主意;本地動態數組可能應該是輸入的副本。 'sampleDex'和'n_k'是索引;這些數組應該是整數類型,而不是浮點數。 (許多強制轉換都是免費的,如果你使用正確的類型,你的代碼不需要任何強制轉換。)也不清楚'gCRSF_gibbs'的輸出或reslt是什麼。 –

回答

0

讓我們減少你的問題表現出相同的行爲一個小例子:

int main() 
{ 
    double *z; 

    z[0] = 1;  // Undefined behaviour! 

    return 0; 
} 

這裏,z是一個未初始化的指針;它指向一個隨機的位置。解引用它,即嘗試讀取或寫入指針指向的位置導致未定義的行爲。

您可以使用z作爲一個由5個點組成的數組。解決這個問題的最簡單的方法是創建z爲本地陣列:

double z[5] = {1, 1, 2, 0, 0}; 

有在你的代碼可能更多的錯誤。這個答案只解決了明顯違反分段的原因。

+0

'n_k','sampleDex'''','''''''''''''''''''''''''''類似的錯誤發生在 –

+0

@Rishi:是的,'r','a'和'p'不首先不必指點。它們實際上是作爲指針ond傳遞的標量,僅用於讀取'gCRSF_gibbs'中的'r [0]'。 –

+0

謝謝。我改變了數組的定義,並且在兩個函數中也省略了標量r,a,p,Ksize和NumWord的指針定義,現在它工作正常。但是,問題是我需要調用這個函數(不是main(),因爲它只是用於測試!),因此所有輸入參數,甚至標量都需要指針。在那種情況下,我仍然面臨崩潰。你有沒有猜測爲什麼r,a和p不能成爲gCRSF_gibbs中的指針?欣賞你的時間。 – Siamak