LINUX.ORG.RU

C: инициализация структур


0

0

Как "вручную" инициализировать такие структуры?

struct B {
    char* b;
    int  bb;
};


struct A {
    char* a;
    struct B* b;
};

Что-то вроде такого:
struct A* a = { {"qqq", { {"b1", 1}, {"bN", 0}, NULL } },
                    {"abc", { {"a1", 0}, NULL } }};

Но, во-первых gcc выдает кучу warning'ов при компиляции.
Во-вторых, если сделать:
  printf("s = %s\n", a[0].b[0].b);
программа упадет с segmentation fault.


Спасибо.
anonymous

Re: C: инициализация структур

Лучше через typedef и указатели calloc'ом:

typedef struct { char* b; int bb; } A;

typedef A *Aptr;

Aptr one_struct;

И:

if ((one_struct = (Aptr)calloc(1, sizeof(A))) == 0) { perror("calloc"); exit(1); }

marsijanin ★★ ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

Спасибо, про typedef я знаю :). Но меня интересует, что бы эта инициализированная структура хранилась в сегменте данных, а не в куче, т.к. она не будет модифицироваться.

Поэтому, выделение памяти в куче считаю в данном случае ненужным, и вот исходя из этого и возник мой вопрос :).

anonymous ()
Ответ на: Re: C: инициализация структур от anonymous

Re: C: инициализация структур

Тогда сразу при объявлении, на вроде:

truct A { char* a; struct B* b; } a = { {"qqq", { {"b1", 1}, {"bN", 0}, NULL } }, {"abc", { {"a1", 0}, NULL } }};

marsijanin ★★ ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

Тоже не подходит, ибо:

1. Данная структура есть тип, и будет использоваться не только в одном месте программы, а в т.ч. и передаваться как аргумент функциям;

2. Нужен _массив_ инициализированных структур A, а не только один экземпляр :).

anonymous ()
Ответ на: Re: C: инициализация структур от anonymous

Re: C: инициализация структур

Массив структур тогда объявить надо, только запутаться при одновременной инициализацией легко. Лучше уж списком.

marsijanin ★★ ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

Можно по-подробней, что подразумевается под массивом структур? И что подразумевается под списком? Не совсем понятно. Спасибо.

anonymous ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

> Про списки не знаем

Знаем. Только под термином "связанный список". Не подходит.

anonymous ()
Ответ на: Re: C: инициализация структур от anonymous

Re: C: инициализация структур

Массивы структур - это:

truct key { char *word; int count; } keytab[] = { "auto", 0, "break", 0, "case", 0, "char", 0, "const", 0, "continue", 0, "default", 0, /*...*/ "unsigned", 0, "void", 0, "volatile", 0, "while", 0 };

Из Brian W. Kernighan, Dennis M. Ritchie "The C programming Language"

marsijanin ★★ ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

Cool! Не совсем понятно, чем это отличается от того, что я написал в первом сообщении: именно массив я и пытался там описАть.

anonymous ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

> Скобками []

Да, действительно, со скобками промах вышел, спасибо. Но все равно не работает.

anonymous ()

Re: C: инициализация структур

А вот такой код не работает. Все равно валится с segmentation fault.

#include <stdio.h>

struct B
{
    char* b;
    int  bb;
};
struct A
{
    char* a;
    struct B* b;
};


int main(int argc, char** argv)
{
    struct A a[] = { {"qqq", { {"b1", 1}, {"bN", 0}, NULL}},
                     {"abc", { {"a1", 0}, NULL } }
                   };
    printf("s = %s\n", a[0].b[0].b);

    return 0;
}

anonymous ()
Ответ на: Re: C: инициализация структур от anonymous

Re: C: инициализация структур

Надо сразу с объявленим инициализировать, у меня этот код вообще не компилится. Если вместе, то память сразу выделяется, иначе не ясно , например, какого размера char* b будет.

marsijanin ★★ ()
Ответ на: Re: C: инициализация структур от marsijanin

Re: C: инициализация структур

Если отдельно объявить массив структур B, и отдельно массив структур A с указанием там ранее объявленных массивов структур B, то все работает :). Спасибо =).

anonymous ()
Ответ на: Re: C: инициализация структур от anonymous

Re: C: инициализация структур

struct A a[] = { {"qqq", { {"b1", 1}, {"bN", 0}, NULL}},
                     {"abc", { {"a1", 0}, NULL } }
                   };

У тебя A::b это указатель на структуру B, а ты пытаешься его инициализировать чем-то непонятным типа { {"b1", 1}, {"bN", 0}, NULL}}.
Мы то интуитивно догадываемся, что это массив. Но компилятор лишен интуиции.
Либо размещай в куче, либо делай A::b массивом.

Vinick ★★ ()
Ответ на: Re: C: инициализация структур от anonymous

Re: C: инициализация структур

Кто мешал доизвращаться? :-)

struct B
{
    char* b;
    int  bb;
};
struct A
{
    char* a;
    struct B* b;
};
                                                                                
struct A aa[] = {
                        {"qqq", (struct B[3]){{"b1",1},{"bN",0}}},
                        {"abc", (struct B[2]){{"a1",0}}}
                };

io ★★ ()

Re: C: инициализация структур

странно что никто не послал до сихпор учить матчасть...

и похоже кто-то из телепатов вернулся с отпуска на чьёто счастье...;-)

cvv ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.