2010-11-08 5 views
0
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 




} 

je veux savoir pourquoi cette fonction void Cadastrar_Radio(R_cidade**q) n'imprime pas les donnéesDeux struct, une référence à une autre

Répondre

1

Vous AFFECTÉ stockage pour votre structure primaire, mais pas le secondaire. Changer

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

à:

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

qui allouera les deux. Sans cela, il y a de très bonnes chances que fre pointe sur un terrain jamais-jamais (comme dans "vous ne pouvez jamais dire ce qui va se passer puisqu'il s'agit d'un comportement indéfini)

0

Vous avez réservé du stockage, mais vous « ai pas correctement initialisé aucune.

vous ne tirerez rien fiable pour imprimer jusqu'à ce que vous mettez des valeurs fiables dans les structures.

de plus, comme PaxDiablo a également souligné, vous avez alloué l'espace pour la structure R_cidade, mais pas pour le composant Radiof Vous utilisez scanf() pour lire une valeur dans à l'espace qui n'a pas été attribué; ce n'est pas fiable - comportement indéfini au mieux, mais le plus souvent le temps de décharge de base.

Notez que bien que les deux types soient liés, le compilateur C n'effectue certainement aucune allocation de Radiof simplement parce que R_cidade le mentionne. Il ne peut pas dire si le pointeur dans R_cidade est destiné à être à une seule structure ou le début d'un tableau de structures, par exemple, de sorte qu'il ne peut pas dire combien d'espace à allouer. En outre, vous ne voudrez peut-être pas initialiser cette structure à chaque fois - vous pourriez être heureux d'avoir laissé pointé nulle part (un pointeur nul) sauf dans des circonstances spéciales connues de vous seulement.

Vous devez également vérifier que l'allocation de mémoire a réussi ou utiliser un allocateur de mémoire garantissant de ne jamais renvoyer un pointeur nul ou non valide. Classiquement, qui pourrait être une fonction de couverture pour la fonction standard malloc():

#undef NDEBUG 
#include <assert.h> 

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

C'est brut mais efficace. J'utilise des routines de rapports d'erreurs non-crashing de mon propre conception à la place de l'affirmation:

#include "stderr.h" 

void *emalloc(size_t nbytes) 
{ 
    void *space = malloc(nbytes); 
    if (space == 0) 
     err_error("Out of memory\n"); 
    return space; 
} 
Questions connexes