自由功能再次出现问题!!!(C linux)

时间:2011-08-03 10:48:56

标签: c linux free

我在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,'\0',((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的功能。你能帮忙解决吗?

3 个答案:

答案 0 :(得分:2)

你没有发布足够的代码,但IMO,你说ps和_ps是全局的,所以一旦你释放_ps,它可能会被你的程序中的其他地方使用,导致它崩溃。 我建议你查看程序,看看_ps的使用位置,或者为我们提供更多的代码。

希望这有帮助。

答案 1 :(得分:1)

free()崩溃意味着可能

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

答案 2 :(得分:1)

您正在分配行-1元素但访问循环中的行元素。 所以我因为那个...... 还有一件事,如果你的_ps是全局的,那么你为什么要归还... ???