2015-02-11 2 views
0

Вопрос связан с моим бывшим вопрос здесь: Arduino compile error while using reference to a struct in another structУказатель на массив указателей указывает на неожиданный адрес

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

Вот пример:

#include <stdio.h> 

unsigned int steps=64; 
unsigned int mode=0; 
unsigned int speed=1; 


typedef struct{ 
    unsigned int option_value; 
    char option_name[17]; 
} SELECTION; 

typedef struct{ 
    char item_name[17]; 
    unsigned int* variable; 
    SELECTION** options; 
} MENU_ITEM; 


SELECTION mode_forward = { 0, "Forward" }; 
SELECTION mode_backward = { 1, "Backward" }; 
SELECTION* options_mode[] = { &mode_forward, &mode_backward }; 

SELECTION speed_slow = { 0, "Slow" }; 
SELECTION speed_normal = { 1, "Normal" }; 
SELECTION speed_fast = { 2, "Fast" }; 
SELECTION* options_speed[] = { &speed_slow, &speed_normal, &speed_fast }; 

MENU_ITEM menu_steps = { "Steps", &steps, NULL }; 
MENU_ITEM menu_mode = { "Mode", &mode, options_mode }; 
MENU_ITEM menu_speed = { "Speed", &speed, options_speed }; 
MENU_ITEM menu_exit = { "Exit", NULL, NULL }; 

const unsigned char menu_items = 4; 
MENU_ITEM* menu_list[menu_items] = { &menu_steps, &menu_mode, &menu_speed, &menu_exit }; 
//----------------------------------------------------------- 

int main(){ 

    int options; 

    options=(int)(sizeof(options_speed)/sizeof(options_speed[0])); 
    printf("Speed options: %i\n\n",options); 

    printf("Address of speed_slow: %p\n",&speed_slow); 
    printf("Address of speed_normal: %p\n",&speed_normal); 
    printf("Address of speed_fast: %p\n",&speed_fast); 
    printf("Address of array: %p\n\n",&options_speed); 

    MENU_ITEM item; 
    item=*menu_list[2]; 

    printf("Menu Item: %s - Item Value: %i\n",item.item_name,*item.variable); 
    printf("Address of name: %p\n",&item.item_name); 
    printf("Address of variable-pointer: %p\n",&item.variable); 
    printf("Address of options-pointer: %p\n",&item.options); 
    printf("Value of options-pointer: %p\n",*item.options); 


    return 0; 
} 

Когда я запустить программу я получаю следующий результат:

Speed options: 3 

Address of speed_slow: 0x6010c0 
Address of speed_normal: 0x6010e0 
Address of speed_fast: 0x601100 
Address of array: 0x601120 

Menu Item: Speed - Item Value: 1 
Address of name: 0x7fff18a5dc90 
Address of variable-pointer: 0x7fff18a5dca8 
Address of options-pointer: 0x7fff18a5dcb0 
Value of options-pointer: 0x6010c0 

Вот что я ожидал .... кроме последней строки. Не должен ли адрес, который он указывает, 0x601120 - адрес options_speed массив? Почему он указывает на первый элемент массива? Что мне нужно изменить, чтобы он указывал на 0x601120?

+1

Проверьте [приоритет оператора] (http://en.cppreference.com/w/cpp/language/operator_precedence) '* menu_list [2]' делает то, что вы считаете. – WhozCraig

+0

'* menu_list [2]' и '* (menu_list [2])' дайте мне тот же результат, поэтому я предполагаю, что часть будет права ... но я добавлю parentheseis, просто чтобы быть уверенным. –

+0

Это, безусловно, прояснит намерение, хотя вы правы, я верю. Я также думаю, что 6502 является точным в его ответе. [посмотреть это вживую] (http://ideone.com/wSgwJ7) – WhozCraig

ответ

1

Вы оцениваете *item.options, а не item.options. Кажется, это не то, что вы хотели напечатать (т. Е. «Указатель опций»), поскольку есть дополнительная операция разыменования.

+0

Да ... это шаг вперед. Если изменить строку из 'printf (« Значение опций-указатель:% p \ n », * item.options),' - 'printf (« Значение опций-указатель:% p \ n », item .options); ' Я получаю правильный результат .... но теперь я застрял на следующем шаге. Я немного поиграю, прежде чем вернуться к этому вопросу. –