2016-02-08 4 views
1

Надеюсь, вы можете мне помочь.Указатель на указатель в C

У меня есть функция в c, которая берет файл, читает строку для строки и сохраняет каждую строку в виде строки. Он работает в этой функции

int createDownloadList(FILE **dllistref, dltask* taskList) { 
    ... 
    taskList = (dltask*) malloc(tasksize*allocsize); 
    int num = 0; 
    while(getline(&line, &linesize, *dllistref) > 0) { 
     ... 
     taskList[num] = task; 
     num++; 
     if(num%8 == 0) { 
      taskList = realloc(taskList, (num+allocsize)*tasksize); 
     } 
    } 
    return num; 
} 

Но я хочу получить доступ к указателю на список задач вне функции. Я попробовал это с этим изменением

int createDownloadList(FILE **dllistref, dltask** taskList) { 
    size_t linesize = 256; 
    char* line = (char*) malloc(linesize); 
    size_t tasksize = sizeof(dltask); 
    int allocsize = 8; 
    *taskList = (dltask*) malloc(tasksize*allocsize); 
    int num = 0; 

    while(getline(&line, &linesize, *dllistref) > 0) { 
     ... 
     *taskList[num] = task; 
     num++; 
     if(num%8 == 0) { 
      *taskList = realloc(taskList, (num+allocsize)*tasksize); 
     } 
    } 
    return num; 
} 

Но после третьей задачи я получаю ошибку сегментации и не знаю почему. Надеюсь, кто-то может мне помочь, я не знаю, почему это не сработает. О, и вот как я называю вторую функцию в главном методе:

dltask* taskList = NULL; 
numOfTasks = createDownloadList(&fileref_dllist, &taskList) 

Я только добавляемые в «&» в вызове, в противном случае это тот же самый вызов для первой функции.

+1

Добро пожаловать в переполнение стека! [Пожалуйста, ознакомьтесь с этим обсуждением, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+4

'realloc (taskList, (num + allocsize) * tasksize);' -> 'realloc (* taskList, (num + allocsize) * tasksize);' – LPs

+0

вызов 'realloc()' может завершиться с ошибкой. Когда он терпит неудачу, '* tasklist' будет содержать NULL, поэтому указатель на уже выделенную память накладывается, теряется. Это означает, что указатель не может быть передан в 'free()'. это приводит к утечке памяти. При вызове 'realloc()' всегда используйте временную/локальную переменную, затем проверяйте (! = NULL) временную переменную перед тем, как присвоить переменной '* tasklist'. – user3629249

ответ

1

Линия

*taskList = realloc(taskList, (num+allocsize)*tasksize); 

должны быть

*taskList = realloc(*taskList, (num+allocsize)*tasksize); 

EDIT

Вторая ошибка, обнаруженный @ user3121023, является:

*taskList[num] = task; 

, который должен быть

(*taskList)[num] = task; 
+0

Спасибо за ваш ответ , Но это не имеет значения. Такая же ошибка сегментации после третьего элемента :( – mKay

+0

@mKay У нас нет вашего реального кода. Я не вижу других ошибок. Является ли 'tasksize * allocsize' хотя бы элементом' 8'? – LPs

+0

да, я могу скопировать код, если вы хочу, но я думал, что не может быть ошибки, потому что первая функция работает, тот же размер, то же самое, и все, что я изменил, было указателем taskList. Но я отредактирую его в своем вопросе. – mKay

Смежные вопросы