[解決済み] 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};
あなたのコードにはもっと多くの誤りがあるはずです。この回答は、明らかなセグメンテーション違反の原因だけを取り上げています。
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み] テスト
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] プログラムがクラッシュしたときにスタックトレースを自動的に生成する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】strcmpが機能しない
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。