自由函数又出问题了!!linux (C)



我在C linux中的free()函数有一个问题。下面是我的示例代码:

typedef struct
{
    char index[2];
    char color[2];
    char duration[2];
} ps;
ps *_ps = NULL;

我需要使用以下函数反复分配和释放上述结构:

ps * readMatrix(mmc_item_item_screen *_item_screen,int rows,int skip)
{
    if(_ps)
    {
        free(_ps);
        _ps=(ps *)NULL;
    }
    _ps=(ps *)calloc(rows-1,sizeof(ps));

memset(_ps,'',((rows-1)*sizeof(ps)));
    int i=0;
    for(i=0;i<rows;i++)
    {
        if((i+1)>=skip)
        {
            sprintf(_ps[i].index,"%d",i);
            sprintf(_ps[i].color,"%s",getCDKMatrixCell(_item_screen->matrix,i+2,1));
            sprintf(_ps[i].duration,"%s",getCDKMatrixCell(_item_screen->matrix,i+2,2));
        }
        else
        {
            sprintf(_ps[i].index,"%d",i);
            sprintf(_ps[i].color,"%s",getCDKMatrixCell(_item_screen->matrix,i+1,1));
            sprintf(_ps[i].duration,"%s",getCDKMatrixCell(_item_screen->matrix,i+1,2));
        }
    }
    return _ps;
}
main()
{
while(1)
....
_ps=readMatrix(_item_screen,rows,getCDKMatrixRow(_item_screen->matrix));
....
}

第一次调用上面的函数时,_ps是NULL,所以没有调用free()。但是第二次(_ps已经分配了),当free()被调用时,程序就崩溃了。

你能帮我一下吗?

(ps和_ps都是全局的)

谢谢。Edit1我把整个操作_ps的函数。这是唯一一个作用于_ps的函数。你能帮帮忙吗?

你没有足够的代码张贴,但在我看来,你说ps和_ps是全局的,所以一旦你释放_ps可能有机会在你的程序的其他地方使用,导致它崩溃。我建议你浏览一下程序,看看_ps在哪里被使用了,或者给我们提供更多的代码。

你正在分配rows-1元素,但在循环中访问rows元素。所以我,因为……还有一件事,如果你的_ps是全局的,那么你为什么要返回它???

free()崩溃意味着可能要么:

  1. 你已经释放了这个内存,
  2. 分配的内存已损坏-检查是否覆盖了一些内存。
  3. 你试图释放的指针,不是从malloc/calloc返回的指针-检查你是否在某处更改了_ps值。

最新更新