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;
}