2016-09-05 2 views
1

У меня есть следующий код. Кажется, что последовательность чтения неверна. Любая помощь?Двойное разыменование в структуре C

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct punct{ 
int x; 
int y; 
}COORD; 

typedef struct nod{ 
COORD *coord; 
struct nod *urm; 
}NOD; 
int main() 
{ 
    NOD *head= malloc(sizeof(NOD)); 
    scanf("%d", &head->coord->x); 
    scanf("%d", &head->coord->y); 
    printf("%d, %d", head->coord->x , head->coord->y); 

    return 0; 
} 

Я успешно удалось получить доступ только х поле структуры с помощью head->coord, и от того, что я могу сказать, что это проблема с моим кодом. Я уже в первом поле первой структуры, поэтому я не могу получить доступ к x/y из-за этого.

+4

Где вы инициализируете 'head-> coord'? –

+0

Попробуйте правильную парантезу: 'scanf ("% d ", & ((head-> coord) -> y));' –

+0

@OliverCharlesworth Спасибо, не подумал об этом. Думал, что я получил его при инициализации головы. –

ответ

2

Вы не инициализировали head->coord. Разделение неинициализированных указателей приводит к undefined behaviour. Вам нужно сделать что-то вроде:

head->coord = malloc(sizeof (COORD)); 

Вы должны также проверить возвращаемое значение malloc() неудач.

4

Вы не инициализировали переменную координат, так что вы также можете использовать malloc для этого.

head->coord = malloc(sizeof (COORD));

Но в этом случае было бы лучше поставить COORD в NOD вместо ссылки на него!

Итак:

typedef struct nod{ 
    COORD coord; 
    struct nod *urm; 
}NOD; 

Вы должны только действительно сделать указатель на него, когда вы собираетесь поменять объект много или когда его более сложный объект.

+1

В настоящее время мы введем 'COORD'. Если бы это был массив значений «COORD», вам понадобился бы подсчет. –

+0

@JonathanLeffler Say Я хочу создать массив COORD. Как создать ссылку между let позволяет указать массив 'COORD ** A = malloc (n * sizeof (COORD *)) ;, где n - число пар x, y и список элементов типа NOD. Я думал о том, что до тех пор, пока голова не станет NULL, где голова - это начало моего списка, где с каждой итерацией я делаю «A [i] -> x = head-> coord-> x' и' A [i] - > y = head-> coord-> y'. Есть предположения? –

+0

@AlexPostolache: предполагается структура, подобная: 'typedef struct nod {size_t num_coords; COORD * координация; struct nod * urm; } NOD; ', то вы должны определить' NOD * nod = malloc (sizeof (* nod)); if (nod == 0) {... error ...; } nod-> coord = malloc (n * sizeof (* nod-> coord)); if (nod-> coord == 0) {... error ...; бесплатно (кивок); } nod-> num_coords = n; nod-> urm = 0; 'или около того. Это выделяет массив координат для использования структурой: 'nod-> coord [0]' .. 'nod-> coord [nod-> num_coords - 1]' являются допустимыми ссылками. –

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