简体   繁体   English

多维数组的内存分配问题

[英]Memory allocation issue with multidimensional array

#define MAXROWS 88
#define MAXSTATES 10
#define MAXPROBS 6

int obs[MAXROWS]= {0,5,2,3,0,5,2,3,2,4,0,3,5,1,4,3,1,5,2,0,4,4,1,5,3,3,1,4,0,5,1,2,3,0,2,0,5,2,0, 4,4,5,3,0,5,2,5,1,5,4,0,3,1,4,5,2,3,5,1,5,2,4,5,1,5,4,2,5,0,3,4,1,5,2,4,1,5,0,4,2,3,0,5,1,5,2,4,1};//{2,1,0} ;
int q[MAXROWS]= {1};
int s=MAXROWS, i=1,j=0;
double **A; 
double **B; 
double AD[MAXSTATES][MAXSTATES]={{0,1,0,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0},{0,0,0,0,1,0,0,0,0,0},{0.8,0,0,0,0,0.2,0,0,0,0},{0,0,0,0,0,0,1,0,0,0},{0,0,0,0,0,0,0,1,0,0},{0,0,0,0,0,0,0,0,1,0},{0.2,0,0,0,0,0.8,0,0,0,0}};//{{.6,.4},{.3,.7}};//{  { .500, .375, .125 }, { .250,.125, .625 }, { .250,.375,.375 } };
double BD[MAXSTATES][MAXPROBS]={{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15}};//{{.1,.3,.6},{.5,.4,.1}};//{ { .60, .20 ,.15, .05}, { .25, .25, .25, .25 }, { .05,.10,.35,.50 } };
double *pi;
double pi2[MAXSTATES] =  {1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};//{.4,.6};
double *poolA;
double *curPtrA;
double *poolB;
double *curPtrB;
double pproba=0;
double **delta;
double *pool;
double *curPtr;

int **psi;
int *poolpsi;
int *curPtrpsi;

HMM model; 

A = (double** )calloc(MAXSTATES, sizeof(double* ));

poolA = (double *)calloc( MAXSTATES * MAXSTATES, sizeof(double));
curPtrA = poolA;

for( i = 0; i < MAXSTATES; i++)
{
    *(A + i) = curPtrA;
        curPtrA += MAXSTATES;
}

B = (double** )calloc(MAXSTATES, sizeof(double* ));

poolB = (double *)calloc( MAXSTATES * MAXPROBS, sizeof(double));
curPtrB = poolB;

for( i = 0; i < MAXSTATES; i++)
{
    *(B + i) = curPtrB;
        curPtrB += MAXPROBS;
}

for(i = 0; i <MAXSTATES; i++)
    for(j=0; j< MAXPROBS; j++)
        B[i][j] = BD[i][j];

for(i = 0; i < MAXSTATES; i++)
    for(j=0; j< MAXSTATES; j++)
        A[i][j] = AD[i][j];


pi = (double* )calloc(MAXSTATES, sizeof(double* ));

for(i = 0; i <MAXSTATES; i++)
    pi[i] = pi2[i];


model.M=MAXPROBS;
model.N=MAXSTATES;
model.A= A; 
model.B = B;
model.pi = pi; 
//double delta[6][4];


    psi = (int** )calloc(MAXROWS, sizeof(int* ));

    poolpsi = (int *)calloc( MAXROWS*MAXSTATES, sizeof(int));
    curPtrpsi = poolpsi;

    for( i = 0; i < MAXROWS; i++)
    {
        *(psi + i) = curPtrpsi;
         curPtrpsi += MAXSTATES;
    }

I start getting error on psi = (int **) ... line about heaps which is like this: 我开始在psi =(int **)上得到错误...关于堆的行是这样的:

"Windows has triggered a breakpoint in TestProj.exe. “Windows在TestProj.exe中触发了一个断点。

This may be due to a corruption of the heap, which indicates a bug in TestProj.exe or any of the DLLs it has loaded. 这可能是由于堆的损坏,这表明TestProj.exe或其加载的任何DLL中存在错误。

This may also be due to the user pressing F12 while TestProj.exe has focus. 这也可能是由于用户在TestProj.exe具有焦点时按下F12。

The output window may have more diagnostic information." 输出窗口可能包含更多诊断信息。“

pi = (double* )calloc(MAXSTATES, sizeof(double* ));

我认为你应该有sizeof(double)not pointer,因为它是一个double值数组。

如下分配内存避免了在整个地方重复类型名称的需要,因此您不会错配它。

double* pi = calloc(MAXSTATES, sizeof(*pi));
   int **psi , i;

    psi = malloc( MAXROWS * sizeof(int*));

    for( i = 0 ; i < MAXROWS ; i++ )
    {
         psi[i] = calloc (MAXSTATES, sizeof(int));
    }

Try to do that and a little check if psi is not null could be great ^^. 尝试做到这一点,并检查psi是否为空可能是伟大的^^。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM