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

Тема в разделе "Общие вопросы по С и С++", создана пользователем vani2, 14 дек 2010.

  1. vani2

    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]
    Заранее всем благодарен.

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

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    На структурЫ ?? Я правильно понял!?
     
  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 всё нормально компилируется.
     
  5. likenix

    likenix Гость

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

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

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

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

Поделиться этой страницей