2015-12-16 4 views
0

В рамках нашего курса по информатике (с использованием C) мы должны построить ОЧЕНЬ расточительную систему с использованием указателей Поскольку нам не разрешено использовать структуры на этом этапе, мы должны использовать ТОЛЬКО указатели для наших динамических массивов.Перераспределение указателей указателей указателей

Я создал динамический массив ** студентов и выделил место для него. в этот момент, я отправить этот динамический массив (** студентов) к функции, которая отправляет его в другую функцию (я отправить & студентов, так что я могу изменить их по адресу)

Моя проблема в том, что я не знаю (по-видимому, - и после многих многих попыток), как перераспределить пространство этого динамического массив

чтобы быть конкретными, так как я послал массив 2 раза: моей первая функцию принимает *** студенты и моя вторая функция принимает * *** ученики

Я попытался перераспределить пространство следующим образом (я нахожусь в функции SECOND в данный момент)

*students = (char**)realloc(*students, 2 * sizeof(char*)); 
*students[1] = (char*)malloc(sizeof(char)) 

это, казалось, как способ сделать это - по-видимому, я был неправ любая помощь будет с благодарностью получил :)

Edit:

Программа будет работать, если я это сделать:

**students = (char**)realloc(**students, 2 * sizeof(char*)); 

, но тогда я не смог правильно использовать таНос ..

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

+6

Не отвергни результат из 'malloc' и друзей в С. – Olaf

+4

Обратите внимание, что, будучи три звезды программист не комплимент в C. Что бы этого сделать четырехзвездочного программиста? – Olaf

+0

См. Http://c2.com/cgi/wiki?FiveStarProgrammer. Всегда есть большая рыба. – Bathsheba

ответ

0

Я создал динамический массив ** студентов и выделил место для . на данный момент я посылаю этот динамический массив (** students) в функцию , которая отправляет ее в функцию ANOTHER (я посылаю & учеников, поэтому я могу изменить их по адресу) ... Конкретно, поскольку я отправил массив 2 раза: моя первая функция получает *** студентов и моя вторая функция получает **** студентов

Там нет смысла в принятии адреса указатель массива (т.е. &students) больше, чем один раз, так как мы уже тогда имеют средства для перераспределения массива:

void ANOTHER_function(char ***students) 
{ 
    *students = realloc(*students, 2 * sizeof **students); // room for 2 char * 
    (*students)[1] = malloc(sizeof *(*students)[1]);  // room for 1 char 
} 

void a_function(char ***students) 
{ 
    ANOTHER_function(students); // no need for address operator & here 
} 

int main() 
{ 
    char **students = malloc(sizeof *students); // room for 1 char * 
    students[0] = malloc(sizeof *students[0]); // room for 1 char 
    a_function(&students); 
} 

Итак, здесь не нужно больше трех *.


Когда вы были ANOTHER_function(char ****students) и в нем

*students = (char**)realloc(*students, 2 * sizeof(char*)); 

тип *students был char *** и не соответствовал (char**) справа - к счастью, потому что *students был адрес main «s students вместо его стоимости.

**students = (char**)realloc(**students, 2 * sizeof(char*)); 

был правильным (хотя и чрезмерно сложным) в этом случае; соответствующий malloc() для нового элемента был бы

(**students)[1] = malloc(sizeof *(**students)[1]); 
Смежные вопросы