Освобождение указателей в динамическом массиве - PullRequest
0 голосов
/ 26 августа 2011

Исходя из предыдущего вопроса, который у меня был здесь:

Копирование строки из указателя на строку

Я сейчас пытаюсь добавить скопированную строкув динамический массив, размер которого будет постепенно увеличиваться в зависимости от количества файлов на SD-карте и будет воссоздан после замены или замены карты.

ЭтоКод работает отлично с первого раза.После изменения содержимого SD-карты вызывается функция reReadSD (), и fileList освобождается.Новое содержимое SD-карты читается, а новые значения записываются в fileList, однако при распечатке имен из fileList я получаю символы, а не собственные имена.Я предполагаю, что это ошибка в освобождении fileList и его повторной инициализации, поскольку тот же блок кода работает при включении системы (когда reReadSD вызывается в первый раз), но не во второй раз, когда он вызывается.Кто-нибудь может пролить свет на это?

void reReadSD()
{
    free(fileList);
    files_allocated=0;
    num_files=0;
    reRead_flag=0;


    if(f_mount(0, &fatfs ) != FR_OK ){
        /* efs initialisation fails*/
    }//end f_mount 

    FRESULT result;
    char *path = '/'; //look in root of sd card
    result = f_opendir(&directory, path);   //open directory
    if(result==FR_OK){
        for(;;){
            result = f_readdir(&directory, &fileInfo); //read directory
            if(result==FR_OK){
                if(fileInfo.fname[0]==0){break;} //end of dir reached escape for(;;)
                if(fileInfo.fname[0]=='.'){continue;} //ignore '.' files
                TCHAR* temp;
                temp = malloc(strlen(fileInfo.fname)+1);
                strcpy(temp, fileInfo.fname);
                AddToArray(temp);
            }//end read_dir result==fr_ok
        }//end for(;;)
    }//end open_dir result==fr_ok
}//end reReadSD

и ..

void AddToArray (TCHAR* item)
{
    u32 delay; 
    if(num_files == files_allocated)
    {

        if (files_allocated==0)
                files_allocated=5; //initial allocation
        else
                files_allocated+=5; //more space needed 

        //reallocate with temp variable
        void *_tmp = realloc(fileList, (files_allocated * sizeof(TCHAR*)));

        //reallocation error
        if (!_tmp)
        {
                LCD_ErrLog("Couldn't realloc memory!\n");
                return;
        }

        fileList = _tmp;

    }//end num_files==files_allocated

    fileList[num_files] = item;
    num_files++;

}//end AddToArray

с ..

TCHAR **fileList;
u32 num_files=0;
u32 files_allocated=0;

Ответы [ 2 ]

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

Насколько мне известно, вы объявили указатель fileList в сегменте данных.Таким образом, он имеет нулевое начальное значение.И когда вы перераспределяете это просто действует как malloc.Но когда вы освобождаете его, он все равно указывает куда-то, и перераспределение не выполняется.Вы, вероятно, должны установить порядок fileList = NULL, чтобы выжить.

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

0 голосов
/ 26 августа 2011

Я не вижу очевидной ошибки в этом коде, за исключением того, что если free(fileList) вызывает стандартную библиотечную функцию free, вы освобождаете только память, выделенную массивом указателей, а не отдельные символы, строки которых являются ее элементами. указать, так что у вас есть утечка памяти. Вместо этого вам нужно выполнить итерацию по массиву и освободить каждый элемент по очереди, прежде чем освободить сам массив. Но это не решит вашу прямую проблему.

Лучшее, что я могу порекомендовать, это отладка кода или установка отладочных распечаток в критических местах, чтобы следить за тем, что на самом деле происходит внутри программы.

...