2015-12-10 1 views
1
#include <stdio.h> 
#include <stdlib.h> 
typedef struct minion 
{ 
    int home; 
    struct minion *father; 
} Minion; 
main() 
{ 
    Minion *dummy = (Minion *)malloc(sizeof(Minion)); 
    dummy->father = &dummy; 
    dummy->home = 0; 
    printf("%d %d %d", &dummy, dummy->father, (dummy->father)->father); 
} 

Почему значение (dummy->father)->father отличается от других?Почему эта структура, содержащая указатель на себя, не работает должным образом?

Выход:

2424368 2424368 43 
+0

Это C или C++? Это похоже на C – NathanOliver

+0

Этот код выглядит для меня 'C'. – PaulMcKenzie

+0

У меня довольно хорошее предположение, почему все это похоже на C. – DeiDei

ответ

2
main() 

Это должно быть int main(void).

{ 
    Minion *dummy = (Minion *)malloc(sizeof(Minion)); 

Это более четко и надежно, как написано:

Minion *dummy = malloc(sizeof *dummy); 

...

dummy->father = &dummy; 
    dummy->home = 0; 

Это нормально.

printf("%d %d %d", &dummy, dummy->father, (dummy->father)->father); 

У вас есть несколько проблем.

dummy - объект-указатель. &dummy - адрес этого объекта-указателя. Объект-указатель выделяется в стеке, и нет особых причин заботиться о его адресе.

Если вы хотите напечатать адрес выделенного объекта Minion, измените &dummy на dummy; вам нужно значение объекта-указателя.

%d используется только для печати значений типа int, а не указателей. Чтобы напечатать значение указателя, используйте %p, который ожидает аргумент типа void*, поэтому в целом вам нужно будет преобразовать значение указателя в void* перед его печатью. Эта линия должна выглядеть следующим образом:

printf("%p %p %p\n", 
     (void*)dummy, 
     (void*)dummy->father, 
     (void*)dummy->father->father); 

Обратите внимание, что я добавил \n до конца линии, поэтому он будет печатать правильно. Я также удалил ненужный набор круглых скобок.

} 

Еще одна небольшая точка, не имеющая отношения к вашей проблеме. Обычно определяют typedef для каждого типа struct - но это необязательно. Мое личное предпочтение состоит в том, чтобы опустить typedef и обратиться к типу структуры по его первоначальному названию - в этом случае struct minion. Это проще (так как проще описать тип до его полного определения). Это немного больше набрав, но IMHO код становится яснее, если типы структуры явно структурированы. (Имеет смысл использовать typedef, если вы хотите, чтобы тип был opaque, так что код с использованием этого типа не знает, что это структура.

С другой стороны много программистов на С, предпочитают использовать typedefs для структур, потому что он предоставляет имя для типа, который является одним идентификатором. Выберите стиль и будьте последовательны.

+0

........ спасибо :) –

0
#include <stdio.h> 
#include <stdlib.h> 
typedef struct minion 
{ 
    int home; 
    struct minion *father; 
} Minion; 
main() 
{ 
    Minion *dummy = (Minion *)malloc(sizeof(Minion)); 
    /* dummy->father = &dummy <== already a pointer */ 
    dummy->father = dummy; 
    dummy->home = 0; 
    printf("%p %p %p", dummy, dummy->father, (dummy->father)->father); 
} 
+0

да, лучше использовать% p, но он не решает проблему. –

+0

@ E.Pajouheshgar удаление & из манекена делает, и он уже показал это вам. – Slava

+0

спасибо :) нормально работает –