1. ホーム
  2. c

[解決済み] Code::Blocksがクラッシュする :プロセスが返される (0xC0000005)

2022-02-02 12:24:47

質問

コードブロック上で以下のコードをビルドして実行しようとしていますが、クラッシュして(0xC0000005)エラーを返します。私は主にgCRSF_gibbs関数内のポインタn_kのためのreallocの使用を疑うが、私はクラッシュのソースを追跡する方法がわからない。これは私のオリジナルのコードではなく、また私はCの初心者です。

#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;}

解決方法は?

同じ挙動を示す最小限の例に問題を絞り込んでみましょう。

int main()
{
    double *z;

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

    return 0;
}

ここです。 z は初期化されていないポインターで、ランダムな場所を指しています。このポインタの参照解除、つまりポインタが指す場所への読み書きをしようとすると、未定義の動作になります。

あなたは z を5個の浮動小数点数の配列として使用します。これを修正する最も簡単な方法は z をローカル配列として使用します。

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

あなたのコードにはもっと多くの誤りがあるはずです。この回答は、明らかなセグメンテーション違反の原因だけを取り上げています。