Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自由函数再次出现问题!!!(C linux)_C_Linux_Free - Fatal编程技术网

自由函数再次出现问题!!!(C linux)

自由函数再次出现问题!!!(C linux),c,linux,free,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) {

我对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*读取矩阵(mmc\u项目\u项目\u屏幕*\u项目\u屏幕,整数行,整数跳过)
{
如果(_ps)
{
免费(p),;
_ps=(ps*)空;
}
_ps=(ps*)calloc(第1行,大小为(ps));
memset(_ps,'\0',((第1行)*sizeof(ps));
int i=0;
对于(i=0;i=skip)
{
sprintf(_ps[i]。索引,“%d”,i);
sprintf(_ps[i].color,“%s”,getCDKMatrixCell(_item_screen->矩阵,i+2,1));
sprintf(_ps[i]。持续时间,“%s”,getCDKMatrixCell(_item_屏幕->矩阵,i+2,2));
}
其他的
{
sprintf(_ps[i]。索引,“%d”,i);
sprintf(_ps[i].color,“%s”,getCDKMatrixCell(_item_screen->matrix,i+1,1));
sprintf(_ps[i]。持续时间,“%s”,getCDKMatrixCell(_item_屏幕->矩阵,i+1,2));
}
}
返回(ps);;
}
main()
{
而(1)
....
_ps=readMatrix(_item_screen,rows,getCDKMatrixRow(_item_screen->matrix));
....
}
我第一次调用上述函数时,_ps为NULL,因此不会调用free()。但第二次(已经分配了)调用free()时,程序就会崩溃

你能帮我吗

(ps和_ps都是全球性的)

多谢各位。
Edit1我把整个操作ps的函数都放进去了。这是唯一一个操作ps的函数。你能帮我一下吗?

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


希望这能有所帮助。

你没有发布足够的代码,但在我看来,你说ps和_ps是全球性的,所以一旦你释放了_ps,它可能会在你程序的其他地方被使用,导致它崩溃。 我建议您检查一下程序,看看在哪里使用了_ps,或者向我们提供更多的代码

希望这能有所帮助。

空闲时发生崩溃()
意味着可能以下情况之一:

  • 你已经释放了这个内存
  • 分配的内存已损坏-检查是否覆盖了部分内存
  • 您尝试释放的指针不是从malloc/calloc返回的指针-检查您是否在某处更改了
    \u ps
  • free()
    发生崩溃意味着可能发生以下情况之一:

  • 你已经释放了这个内存
  • 分配的内存已损坏-检查是否覆盖了部分内存
  • 您尝试释放的指针不是从malloc/calloc返回的指针-检查您是否在某处更改了
    \u ps

  • 您正在分配rows-1元素,但正在访问循环中的rows元素。。 所以我就因为这个。。。
    还有一件事,如果你的P是全球性的,那么你为什么要返回它

    您正在分配rows-1元素,但正在访问循环中的rows元素。。 所以我就因为这个。。。

    还有一件事,如果你的P是全球性的,那么你为什么要返回它

    错误不在此代码中。另外请注意,您不需要强制转换指针,这会使代码更易于阅读。纯sigsegv或您是否看到一些其他错误消息,如堆损坏?您可以分配
    rows-1
    元素,但可以访问loopmore中的
    rows
    元素作者的注释:1-code是单线程2-casting已按照您的建议删除(谢谢)3-sigsegv!我不知道那是什么。将检查您是否愿意解释更多plz 4行和行1由for循环中的“skip”元素处理(无论如何,程序在此之前崩溃!)错误不在此代码中。另外请注意,您不需要强制转换指针,这会使代码更易于阅读。纯sigsegv或您是否看到一些其他错误消息,如堆损坏?您可以分配
    rows-1
    元素,但可以访问loopmore中的
    rows
    元素作者的注释:1-code是单线程2-casting已按照您的建议删除(谢谢)3-sigsegv!我不知道那是什么。将检查您是否愿意解释更多plz 4行和行1是由for循环中的“skip”元素处理的(无论如何,程序在此之前崩溃!)对吧!我不应该返回该函数。但这可能是问题的原因吗?这取决于您如何处理该函数的返回。。!是的,它可能会引起问题是的,这就是问题所在。这部分代码是我确信自己是对的:)tanx bro!在某些情况下,返回全局变量或函数参数对于缩短代码非常有用。一些例子:
    func(arg)->x而不是
    func(arg);arg->x
    while(func()){…;}
    insead of
    func();而(ps){…;func();}
    ,…对!我不应该返回该函数。但这可能是问题的原因吗?这取决于您如何处理该函数的返回。。!是的,它可能会引起问题是的,这就是问题所在。这部分代码是我确信自己是对的:)tanx bro!在某些情况下,返回全局变量或函数参数对于缩短代码非常有用。一些例子:
    func(arg)->x而不是
    func(arg);arg->x
    while(func()){…;}
    insead of
    func();虽然(ps){…;func();}
    ,…不知怎的,你是对的。我已经释放了内存,除了malloc/alloc/strdup之外,我没有别的东西。。。。。。我破坏了记忆。你的回答是引起我怀疑的第一个线索。其他人帮我找到它。tanx@WAHID佩剑-我很高兴它被解决了。回答后没时间看…不知怎么的,你是对的。我已经释放了内存,除了malloc/alloc/strdup之外,我没有别的东西。。。。。。我破坏了记忆。你的回答是引起我怀疑的第一个线索。其他人帮我做些什么