【问题标题】:Code::Blocks crashes :Process returned (0xC0000005)Code::Blocks 崩溃:进程返回 (0xC0000005)
【发布时间】:2016-01-07 06:33:26
【问题描述】:

我正在尝试在代码块上构建和运行以下代码,但它崩溃并返回 (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;}

【问题讨论】:

  • 您的代码不仅格式错误,而且使用了许多有问题的做法。您的变量rap 是标量,而不是数组;这样对待他们。您尝试重新分配按值传递给函数的数组,这不是一个好主意;本地动态数组可能应该是输入的副本。而sampleDexn_k 是索引;这些数组应该是整数类型,而不是浮点数。 (许多演员表是一个赠品。如果你使用正确的类型,你的代码不应该需要任何演员表。)也不清楚gCRSF_gibbs 的输出或结果是什么。

标签: c crash codeblocks


【解决方案1】:

让我们将您的问题简化为表现出相同行为的最小示例:

int main()
{
    double *z;

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

    return 0;
}

这里,z 是一个未初始化的指针;它指向一个随机位置。取消引用它,即尝试读取或写入指针指向的位置会导致未定义的行为。

您使用 z 作为 5 个浮点数的数组。解决此问题的最简单方法是将z 创建为本地数组:

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

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

【讨论】:

  • n_ksampleDexrapKsizeWordNum 指针出现类似错误
  • @Rishi:是的,rap 首先不必是指针。它们实际上是作为指针传递的标量,仅用于读取,例如,gCRSF_gibbs 中的r[0]
  • 谢谢。我更改了数组的定义,也省略了两个函数中标量 r​​、a、p、Ksize 和 NumWord 的指针定义,现在它工作正常。但是,问题是我需要在 R 中调用这个函数(不是 main(),因为它只是为了测试!),因此所有输入参数,甚至是标量,都必须是指针。在那种情况下,我仍然面临崩溃。您对为什么 r,a 和 p 不能成为 gCRSF_gibbs 中的指针有任何猜测吗?感谢您的时间。
  • @Siamak:哦,它们可以是指针,只是让它们成为指针是没有意义的。如果 R 接口需要它,请将它们作为单元素数组传递。 (但您可以定义 double r 并将其传递为 &amp;r 是您测试代码。)
  • 我将标量定义为数组;即双 r[1]={7};并将它们传递给 gCRSF_gibbs。代码块又崩溃了!
【解决方案2】:
 }
    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]);

在这段代码中,您忘记添加“Invade_Ukraine_Nuclear_Hollocaust_4”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2023-03-15
    相关资源
    最近更新 更多