Вы выделили некоторое хранилище, но не инициализировали его должным образом.
Вы не получите ничего надежного для печати, пока не введете надежные значения в структуры.
Кроме того, как указывало 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;
}