调试出错,EXPRESSION:BLOCK_TYPE_IS_VALID(pHead->nBlockUse )

调试出错,求助:EXPRESSION:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse )
调试出错,EXPRESSION:BLOCK_TYPE_IS_VALID(pHead->nBlockUse )
我的程序中调用了以下函数:
void fft(int fft_nLen, int fft_M,int isign)
{
     int i;
     int lev,dist,p,t;
     complex B;

     W = (complex *)malloc(complexsize*fft_nLen/2);

     for(lev=1; lev<=fft_M; lev++)
     {
         dist = (int)pow(2.0,lev-1);
         for(t=0; t<dist; t++)
         {
             p = isign*t*(int)pow(2.0,fft_M-lev);
             W[p].real = (float)cos(2*PI*(p)/fft_nLen);
             W[p].image = (float)(-1*sin(2*PI*(p)/fft_nLen));
             for(i=t; i<fft_nLen; i=i+(int)pow(2.0,lev))
             {
                 B = Add(A[i],Mul(A[i+dist],W[p]));
                 A[i+dist] = Sub(A[i],Mul(A[i+dist],W[p]));
                 A[i].real = B.real;
                 A[i].image = B.image;
             }
         }
     }

     free(W);
}
我在网上查到,出现这种问题一般都是同一个内存释放了两次,但是我的问题是,当isign设置为1的时候,程序运行正常,当isign设置为-1时才会报错。所以应该和内存重复释放没有关系。那么问题出现在哪里呢?


------解决思路----------------------
 p = isign*t*(int)pow(2.0,fft_M-lev);  这里 isign为负的时候p计算来是否会为负数呢?
W[p] 访问时是否会越界呢?

基本上是由于越界, 导致内存被破坏, 释放时就会出错.

------解决思路----------------------
     p = isign*t*(int)pow(2.0,fft_M-lev);
             W[p].real = (float)cos(2*PI*(p)/fft_nLen);
             W[p].image = (float)(-1*sin(2*PI*(p)/fft_nLen));

isign = -1;
p为负数,然后一个负数当做下标?!