Массив указателей

  • Автор темы vani2
  • Дата начала
V

vani2

#1
Здравствуйте.
Требуется для задачи создать массив неизвестной длины из указателей на структуру.
Как будет выглядеть на С(ANSI)?
Моё предположение:
<!--shcode--><pre><code class='c'>struct tablic *x[];[/CODE]
Если так , то как затем выделять память под новый указатель?
Моё предположение:
<!--shcode--><pre><code class='c'>*(x+i)=(struct tablic*)malloc(sizeof(struct tablic));[/CODE]
Заранее всем благодарен.

Мои предположения проверки не прошли-как-то по-другому должно быть.
 
G

Guest

#2
Код:
struct tablic *x[];
*(x + 1) = (struct tablic *) malloc (sizeof (struct tablic));
Компилятор разразится страшной бранью.
Вы создали статический массив. Статический массив получает длину при инициализации, и эта длина уже НЕ ИЗМЕНЯЕТСЯ.
На C++ эту задачу я решал так:
Код:
tablic **x = new tablic *[i]; // i - длина нашего массива указателей.
Но если именно на C... Надо будет подумать, т. к. пользуюсь только вышеописанным способом.
 
G

Guest

#4
Вот, немного подумал и кое-что в голову пришло:
C++:
struct tablic **x = (struct tablic **) malloc (sizeof (struct tablic *) * i); // i - длина нашего массива указателей на структуры.
Чтобы обратиться к элементу массива, делаем так:
C++:
*(x + n) // где n - индекс элемента массива.
Вот пример:
C++:
struct tablic **x = (struct tablic **) malloc (sizeof (struct tablic *) * 125);
memset ((void **) x, 0, sizeof (tablic **) * 125);
for (int i = 0; i < 125; i++)
cout << *(x + i) << endl;
free ((void *) x);
Правда, для C надо будет выводить через cprintf, но я в этой функции вообще не смыслю. Проверьте, если будут ошибки, сообщайте. На VC++ 6.0 всё нормально компилируется.
 
L

likenix

#5
Здравствуйте уважаемые форумчане, позвольте внести свою скромную лепту.

1. struct tablic **x - две звездочки не нужно, если нам конечно не двумерные массивы нужны.
2. Массив лучше закончить NULL так его легче будет в циклах обходить, или если без NULL как в данном случае придется с массивом таскать переменную с размером массива
3.
структуру удобнее объявлять примерно так

C++:
typedef struct A
{
int a;
} A;
тогда в переменную типа A можно просто объявить как в C++, то есть без ключевого слова struct.

Но это все не существенно конечно и дело вкуса.