проблема со свободной функцией снова !!! (C linux) - PullRequest
1 голос
/ 03 августа 2011

У меня проблема с функцией free () в C linux.Вот мой пример кода:

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));
....
}

При первом вызове вышеуказанной функции _psNULL, поэтому free () не вызывается.но во второй раз (_ps уже выделено), программа вылетает, как только вызывается free ().

Можете ли вы помочь мне с этим?

(ps и _ps оба глобальные)

Спасибо. Edit1 Я поставил всю функцию, которая манипулирует _ps.и это единственная функция, работающая на _ps.не могли бы вы помочь пожалуйста?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

У вас недостаточно опубликованного кода, но IMO, вы сказали, что ps и _ps глобальны, поэтому, как только вы освободите _ps, может быть шанс, что он будет использован где-то в вашей программе, что приведет к его аварийному завершению.Я бы посоветовал вам пройтись по программе и посмотреть, где используется _ps, или предоставить нам больше кода.

Надеюсь, это поможет.

1 голос
/ 03 августа 2011

ВЫ выделяете элементы row-1, но получаете доступ к элементам row в вашем цикле. так я из-за этого ... еще одна вещь, если ваш _ps является глобальным, то почему вы возвращаете это .. ???

1 голос
/ 03 августа 2011

Сбой на free() означает , вероятно, , что либо:

  1. Вы уже освободили эту память,
  2. Выделенная память повреждена - проверьте, непереопределяет часть памяти.
  3. Указатель, который вы пытаетесь освободить, не является указателем, возвращенным из malloc / calloc - проверьте, изменилось ли вы где-нибудь значение _ps.
...