2014-12-09 4 views
0

У меня есть две разные структуры, которые имеют общее имя переменной. Как я могу присвоить значение с выводом, вызвав ошибку сегментации?Различные структуры с одинаковыми именами переменных

struct observer *obs; 
obs->next = NULL; 

struct sightings *sights; 
sights->next = NULL; 

Приведенный выше код вызывает ошибку сегментации. Можно ли этого избежать?

Благодаря

+1

Вы должны выделить память для каждой struct.use malloc d this – pang1567

+0

не имеет ничего общего с именами полей. (попробуйте перейти к next1 и next2, вы увидите, что это не так) – pm100

+0

Обзоры и достопримечательности на самом деле ни на что не указывают. – user3629249

ответ

5

Если вы используете C:

struct observer* obs = malloc(sizeof(*obs)); 
struct sightings* sights = malloc(sizeof(*sights)); 

Если вы используете C++:

observer* obs = new observer(); 
sightings* sights = new sightings(); 

Не забудьте указать free или delete соответственно указателям, когда вы закончите с ними.

+0

В C++ это будет считаться плохим стилем; Память 'new''d всегда должна управляться контейнером. –

6

Вы получаете Segfault, потому что вы никогда не назначить корректное значение этих указателей. Это не имеет никакого отношения к названию поля next.

[Обновлено добавить в ответ на комментарий:]

Если вы хотите иметь фиктивный элемент для списка, который вы не выделять через malloc (или тому подобное), то вы можете сделать что-то вроде :

struct observer dummyHead = { .next = NULL }; 
struct observer *obs = &dummyHead; 
+0

Это потому, что эти указатели должны использоваться для указания на начало связанного списка. Они действуют как фиктивные указатели. – nazerb

+0

В качестве указателей они все равно должны указывать на * что-то, чтобы быть действительными. – danfuzz

+0

примечание: вопрос отмечен как C, так и C++. Обозначенный синтаксис инициализатора действителен только в C; однако '= {0};' будет работать на обоих языках. (и нуль инициализирует всех членов) –

Смежные вопросы