Копирование строки из указателя в строку в динамический массив - PullRequest
0 голосов
/ 24 августа 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;
            }

            // Things are looking good so far
            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;

1 Ответ

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

Realloc возвращает указатель на перераспределенный блок памяти, который может совпадать с аргументом ptr или новым местоположением .Следовательно, вызов:

void *_tmp = realloc(fileList, (files_allocated * sizeof(TCHAR*)));

не будет обновлять указатель fileList, если память выделена на новом месте.Адрес нового списка файлов на самом деле хранится в _tmp, поэтому вам нужно будет сделать что-то вроде:

fileList = (TCHAR *) _tmp;

после вызова realloc.

ТакжеЯ не совсем понимаю значение

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

Разве это не всегда делает одно и то же?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...