Две структуры, одна ссылка на другую - PullRequest
0 голосов
/ 08 ноября 2010
typedef struct Radios_Frequencia {
    char tipo_radio[3];
    int qt_radio;
    int frequencia;

}Radiof;
typedef  struct Radio_Cidade  {
    char nome_cidade[30];
    char nome_radio[30];
    char dono_radio[3];
    int numero_horas;
    int audiencia;
    Radiof *fre;

}R_cidade;



void Cadastrar_Radio(R_cidade**q){
    printf("%d\n",i);

    q[0]=(R_cidade*)malloc(sizeof(R_cidade));
    printf("informa a frequencia da radio\n");
    scanf("%d",&q[0]->fre->frequencia);  //problem here
    printf("%d\n",q[0]->fre->frequencia); // problem here




}

я хочу знать, почему эта функция void Cadastrar_Radio(R_cidade**q) не печатает данные

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Вы выделили хранилище для своей первичной структуры, но не вторичной. Изменение

q[0]=(R_cidade*)malloc(sizeof(R_cidade));

до:

q[0]=(R_cidade*)malloc(sizeof(R_cidade));
q[0]->fre = malloc(sizeof(Radiof));

, который выделит оба. Без этого есть очень хороший шанс, что fre укажет на никогда и никогда землю (как в «вы никогда не сможете сказать, что произойдет, потому что это неопределенное поведение).

0 голосов
/ 08 ноября 2010

Вы выделили некоторое хранилище, но не инициализировали его должным образом.

Вы не получите ничего надежного для печати, пока не введете надежные значения в структуры.

Кроме того, как указывало PaxDiablo , вы выделили пространство для структуры R_cidade, но не для ее Radiof компонента.Вы используете scanf() для чтения значения в пространство, которое не было выделено;это ненадежно - в лучшем случае неопределенное поведение, но чаще всего время дампа ядра.

Обратите внимание, что, хотя два типа связаны, компилятор C, безусловно, не выполняет никакого выделения Radiof просто потому, что R_cidade упоминает об этом.Он не может сказать, например, предназначен ли указатель в R_cidade для отдельной структуры или начала массива структур, поэтому он не может определить, сколько места выделить.Кроме того, вы можете не захотеть инициализировать эту структуру каждый раз - возможно, вы будете рады оставить указатель в никуда (нулевой указатель), за исключением некоторых особых обстоятельств, известных только вам.

Вам также следует убедиться, что памятьвыделение выполнено успешно, или используйте распределитель памяти, который гарантирует, что никогда не вернет нулевой или недействительный указатель.Классически, это может быть функция покрытия для стандартной функции malloc():

#undef NDEBUG
#include <assert.h>

void *emalloc(size_t nbytes)
{
    void *space = malloc(nbytes);
    assert(space != 0);
    return(space);
}

Это грубо, но эффективно.Вместо утверждения я использую процедуры сообщения об ошибках, не вызывающие сбоев:

#include "stderr.h"

void *emalloc(size_t nbytes)
{
    void *space = malloc(nbytes);
    if (space == 0)
        err_error("Out of memory\n");
    return space;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...