2015-01-31 3 views
0

Я занимаюсь домашним заданием для Computing II. Это создать список задач в динамически создаваемом массиве строк, который можно манипулировать несколькими способами. Один из способов его управления заключается в добавлении задачи или элемента массива с использованием realloc. Мой код выглядит следующим образом и будет работать до тех пор, пока я не вызову новый массив realloc'd в другой функции.Список дел, перераспределение по C

void add_task(char **List, int line_num){ 
    char task[1000]; 

    List = (char**)realloc(List, (line_num+1)*sizeof(char)); 
    List[line_num] = malloc((1000) * sizeof(char)); 

    printf("Please enter the string you would like to use as your new task.\n"); 
    scanf("%s",task); 
    strcat(task,"\n"); 
    strcpy(List[line_num],task); 
    return; 
} 
+0

Отступ вашего кода. – gsamaras

+0

Добавить знак вопроса в ваше сообщение. –

+0

У вас есть вопросы? Я бы рекомендовал вырезать 'task [1000]', вы можете 'scanf()' непосредственно в буфер 'malloc()' ed. Кроме того, я бы вернул новую строку 'line_num', так как вы можете быть уверены, что какой-то вызывающий абонент забудет увеличить свою копию. – EOF

ответ

1

Ваш realloc() вызов не так, вы предоставляете неправильный размер. С List составляет char**, элементы char*, а не char.

List = realloc(List, (line_num+1)*sizeof(char*)); 

С sizeof(char*), вероятно, будет 4, вы распределяя только 1/4 столько места, сколько нужно. И затем вы пишете за пределами этого массива, что приводит к неопределенному поведению.

В общем, всякий раз, когда вы присваивание <something>* с malloc или realloc, аргумент sizeof должен быть <something>, т.е. просто удалить последнюю * от типа.

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