多维数组的内存分配问题

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

我开始在 psi =(int **)... 行遇到有关堆的错误,错误信息如下:

“Windows已触发TestProj.exe中断点。

这可能是由于堆的损坏导致的,这表明TestProj.exe或其加载的任何DLL中存在错误。

这也可能是由于用户在TestProj.exe具有焦点时按下F12键。

输出窗口可能会有更多诊断信息。”


你能将你的问题简化成一个更短的例子吗? - arne
3个回答

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

我认为你应该使用sizeof(double)而不是指针,因为它是一个双精度值的数组。


1

按照以下方式分配内存可以避免在各个地方重复类型名称,从而避免类型不匹配的问题。

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

0
   int **psi , i;

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

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

尝试这样做,如果psi不为空,则进行一些小的检查会更好^^。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接