我在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()
崩溃意味着可能要么:
- 你已经释放了这个内存, 分配的内存已损坏-检查是否覆盖了一些内存。
- 你试图释放的指针,不是从malloc/calloc返回的指针-检查你是否在某处更改了
_ps
值。