Информация о структуре struct в C - PullRequest
0 голосов
/ 13 февраля 2012

Мне нужна помощь для решения упражнения.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct p_prodotto {
    char *costo;
    char *quantita;
};

typedef struct p_prodotto id_prezzo;

struct partecipante {
    id_prezzo *prezzo;
    unsigned short codice;
};

struct partecipante persona[1] = {{{"We", "Ciao"},100}};

int main()
{
    printf ("%s", persona[0].prezzo.costo); // This doesn't works
    return 0;
}

У меня есть структура p_prodotto с двумя указателями на символы внутри. Есть typedef, затем есть другая структура "partecipante", которая вызывает тип структуры выше.

Это случай структуры struct? Если это так, мне нужно создать массив. Я сделал это так:

struct partecipante persona[1] = {{{"We", "Ciao"},100}};

Я делаю это неправильно? Если это правильно, как я могу получить доступ к полям "costo" и "Quantita"?

Заранее спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 13 февраля 2012
struct partecipante persona[1] = {{{"We", "Ciao"},100}};

Это инициализирует первый член структуры как struct p_prodotto, но он объявляется как указатель на это.Измените struct partecipante на

struct partecipante {
    id_prezzo prezzo;
    unsigned short codice;
};

или инициализируйте его другим способом.

Например,

id_prezzo prz = {"We", "Ciao"};
struct partecipante persona[1] = {{&prz,100}};

int main()
{
    printf ("%s", persona[0].prezzo->costo);
    return 0;
}

, если вы не можете изменить определение struct p_prodotto.

2 голосов
/ 13 февраля 2012

Я вижу некоторые проблемы в вашем коде:

1- Ваш код даже не скомпилируется на gcc.

2- Вы неправильно инициализируете свою структуру и работаете с POINTERS для структур, а не для реальных структур (вы оставляете заглушки, которые должны быть инициализированы чем-то вроде malloc вместо реальных структур)

3- Почему массив [1]? давайте просто снимем это и поработаем с простыми основами, одна простая запись для начинающих: -)

Давайте посмотрим на основную структуру:

struct partecipante {
    id_prezzo *prezzo;
    unsigned short codice;
};

id_prezo * prezzo указывает на структуру, но у нее нет места для хранения данных .... как я вижу, вы все еще изучаете основы, давайте снимем это * и заставим хранить реальные данные (за счет того, что более динамичный, который вам все равно не нужен сейчас , так как вы учитесь).

struct partecipante {
    id_prezzo prezzo; // the partecipante struct now holds enough space to fit a id_prezzo inside it
    unsigned short codice;
};

Исправление распределения основной структуры

struct partecipante persona; // Это место для ОДНОЙ персоны

Инициализация переменной persona внутри блока кода (в данном случае внутри main ()), а также исправление оператора printf

int main()
{

    persona.prezzo.costo = "blabla this is costo";
    persona.prezzo.quantita = "blabla this is quantita";
    persona.codice = 123;

    printf ("Costo is --> %s\n", persona.prezzo.costo); // This know WORKS!
    return 0;
}

Я не буду публиковать готовый исходный код, так что вы можете сами поиграть с исправлениями и развиваться. Удачи!

1 голос
/ 13 февраля 2012

Проблема заключается в следующем:

id_prezzo *prezzo;

Вы определяете prezzo как тип указателя, но создаете его как структуру, а не как указатель на структуру:

{"We", "Ciao"}

У вас есть два варианта, самый простой из которых - просто изменить это:

id_prezzo *prezzo;

На это:

id_prezzo prezzo;

Или вы можете использовать malloc() / free() для созданияуказатель на структуру для вас:

id_prezzo *myPrezzo = malloc(sizeof(id_prezzo));
myPrezzo->costo = "We";
myPrezzo->quantita = "Ciao";
persona[0].prezzo = myPrezzo;

// after you are done with persona:
free(myPrezzo);

В качестве альтернативы, вы можете использовать alloca() или получить адрес локальной переменной структуры, это действительно зависит от времени жизни структуры.

1 голос
/ 13 февраля 2012

вы получаете segfault? Я думаю, что вы должны выделить место для costo и квантит, они просто указатели

...