gpt4 book ai didi

代码:: block 崩溃:进程返回(0xC0000005)

转载 作者:行者123 更新时间:2023-11-30 17:06:30 25 4
gpt4 key购买 nike

我尝试在代码块上构建并运行以下代码,但它崩溃并返回 (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 个 float 的数组。解决此问题的最简单方法是将 z 创建为本地数组:

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

您的代码中可能存在更多错误。此答案仅解决明显的分段违规的原因。

关于代码:: block 崩溃:进程返回(0xC0000005),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34648717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com