Надеюсь, вы можете мне помочь.Указатель на указатель в 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)
Я только добавляемые в «&» в вызове, в противном случае это тот же самый вызов для первой функции.
Добро пожаловать в переполнение стека! [Пожалуйста, ознакомьтесь с этим обсуждением, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –
'realloc (taskList, (num + allocsize) * tasksize);' -> 'realloc (* taskList, (num + allocsize) * tasksize);' – LPs
вызов 'realloc()' может завершиться с ошибкой. Когда он терпит неудачу, '* tasklist' будет содержать NULL, поэтому указатель на уже выделенную память накладывается, теряется. Это означает, что указатель не может быть передан в 'free()'. это приводит к утечке памяти. При вызове 'realloc()' всегда используйте временную/локальную переменную, затем проверяйте (! = NULL) временную переменную перед тем, как присвоить переменной '* tasklist'. – user3629249