• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

vani2

Здравствуйте.
Требуется для задачи создать массив неизвестной длины из указателей на структуру.
Как будет выглядеть на С(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

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

Guest

Вот, немного подумал и кое-что в голову пришло:
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

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

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

C++:
typedef struct A
{
int a;
} A;

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

Но это все не существенно конечно и дело вкуса.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!