У меня есть указатель структурного типа, который я сделал. При запуске программы он начинается как NULL, а затем я использую malloc/realloc, поскольку мне нужно добавить/удалить эти структуры, и я просто собирался использовать свой указатель, чтобы указать на первую структуру и перемещаться по ней как по массиву.
Когда я malloc/realloc, я всегда делаю размер «массива»/области в памяти на единицу больше, чем нужно. Я делаю это, чтобы установить для «последнего индекса»/области в памяти значение NULL, чтобы я мог сказать что-то вроде while (указатель! = NULL).
Я получаю сообщение об ошибке: неверное lvalue в назначении, когда пытаюсь присвоить NULL последней позиции в массиве/области памяти со строками:
// Realloc remotelist by adding one to connrhosts
connrhosts++;
remotelist = realloc(remotelist, sizeof(rhost)*(connrhosts + 1));
(remotelist + connrhosts) = NULL;
Я думаю, что я говорю:
- Пришло время добавить новую структуру в мой массив, поэтому я увеличу число connrhosts на единицу.
- Перераспределите память, указанную в remotelist, в новую область памяти размером с connrhosts (сколько структур я буду использовать), а также одно дополнительное пространство, чтобы я мог сделать его NULL
- Укажите remotelist на новую область памяти
- Используйте мой указатель remotelist и добавьте смещение connrhosts, которое теперь будет указывать на последний индекс области памяти и сделает этот указатель NULL.
Насколько я могу судить (или чувствовать), я все сделал правильно, но я уже некоторое время работаю над этим проектом и у меня сложилось впечатление, что у меня узкое зрение. Я бы хотел, чтобы свежий взгляд взглянул на мою логику/код и дал мне знать, что они думают и что я сделал неправильно. Спасибо еще раз. :D
Изменить. Часть моей проблемы заключается в том, что я неправильно понимаю, что я могу делать с указателями.
Вот моя структура:
typedef struct {
char address[128]; // Buffer that holds our address of the remote host
int port; // Port of the remote host
int conn; // FD to the connection of our remote host
int ofiles; // Open files associated with the remote host
} rhost;
Я надеялся, что смогу прокрутить свой массив/область памяти и сказать, что если это не NULL, то сделайте что-нибудь с ним. Итак, мой исходный оператор цикла - это while (NULL != remotelist). Теперь я считаю, что читаю ответы и комментарии о том, что эта логика неверна, потому что я проверяю, является ли указатель нулевым? Я должен проверить, является ли область памяти/структуры, на которую указывает указатель, нулевой? Если это так, то должно быть что-то вроде while (NULL != *(remotelist + someoffset))?
Я делаю это так, как мой учитель предложил/говорил об этом в классе.
Мое первоначальное объявление/инициализация удаленного списка было следующим: rhost *remotelist = NULL;
++connrhosts, а затем используетеconnrhosts + 1в распределении? Какова цель этого дополнительного+ 1? - person AnT   schedule 08.03.2010ofilesравно -1, это означает конец массива. Вы можете использовать фактический массив указателей с нулевым завершением. Я не рекомендую это: вам придется выделять их отдельно. - person Steve Jessop   schedule 08.03.2010rhostотдельно. Этоsizeof(rhost*), илиsizeof(*remotelist), а неsizeof(*rhost). - person Steve Jessop   schedule 08.03.2010