Перейти к содержимому

Фото
- - - - -

[C/C++] Обращение к массиву структур через указатели?


  • Вы не можете создать новую тему
  • Please log in to reply
3 ответов в этой теме

#1 lucky 1

lucky 1
  • Пользователь
  • 258 сообщений
  • Откуда:нарва, тлн>муста

Отправлено 13 мая 2007 - 19:45

Даже как-то стрёмно спрашивать, но уж больно мало времени осталось. Написал проект по информатике (1ый курс), там основная часть данных хранится в элементах структуры, к которой напрямую обращаются функции. Тока щас осознал, что число элементов у меня задано изначально, а требуется динамическое выделение памяти. Единственный известный мне способ - что-то вроде:
char * p;
p = new char [x];
Посчитать в самом начале работы проги нужное кол-во элементов (меняется в зависимости от файла, с которым работает прога) - не проблема. ОК, кол-во известно, структура называется node, в коде что-то типа:
node * p;
x = NodeCount();
p = new node[x];
По идее вот он мой массив struct'ов и указатель на него, теперь вместо, допустим, node.content буду писать p->content и все дела. Но мне нужны обращения к конкретным элементам типа: node[n].content[m]. По идее если *p указывает на начало массива, то зная, сколько памяти выделяется под один struct, можно node[n]... заменить на (p + (n * размер))->... и указывать это будет туда же. Однако не работает. Первый компонент 1ого элемента структуры (стринг) записывается просто косячно (какие-то левые символы в начале и конце), на втором (инт) вообще предлагает отправить отчёт)) Да и код с такой подстановкой вышел совсем нечитаемый. Должен быть способ лучше, а я, нуб, его не знаю, или вообще не там ищу решение. Напомню, изначальная моя задача такая: вместо struct Node {...} Node[256]; использовать Node[x] где x определяется в самом начале работы программы. Что делать? :)
  • 0

#2 JArik

JArik

    Манкунианец

  • Пользователь
  • 359 сообщений
  • Откуда:Manchester/Tallinn

Отправлено 13 мая 2007 - 20:50

для хранения адресов структур используй vector(vector.h)
декларация такаая :
vector <Node*> imjamassiva;
обращаться потом можн бдет как к маассиву:
imjamassiva[n];
na cplusplus.com подробней
  • 0

#3 satan

satan
  • Пользователь
  • 340 сообщений
  • Откуда:tln

Отправлено 31 мая 2007 - 00:13

node ** p; //ukazatel' na massiv ukazatelei na spisok
p = new node*[x];
.....

и дальше обрашаешься как p[i]->content[m] и т.д.
  • 0

#4 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 31 мая 2007 - 08:53

node ** p; //ukazatel' na massiv ukazatelei na spisok
p = new node*[x];
.....

и дальше обрашаешься как p[i]->content[m] и т.д.

... и получаешь segfault, потому что памяти под p[i] не выделено
  • 0
int main(void)