Structure - Access Structure element without . and ->

后端 未结 2 1642
北海茫月
北海茫月 2021-01-27 16:06

I am required to access some elements from nested structure without using . and ->

I need to print out the values for keyValue

相关标签:
2条回答
  • 2021-01-27 16:24

    Probably they want you to use something like this:

    union {
        mouse_S    mouse;
        keyboard_S keyboard;
        laptop_S   laptop;
    } * oh; // oh = offset helper
    size_t offset_of_mouse_leftButton = (char*)&oh->mouse->leftButton - (char*)&oh->mouse; // this should be 0
    size_t offset_of_mouse_rightButton = (char*)&oh->mouse->rightButton - (char*)&oh->mouse; // but this one can be anything
    size_t offset_of_mouse_middleButton = (char*)&oh->mouse->middleButton - (char*)&oh->mouse; // this too
    // ...
    size_t offset_of_keyboard_alternateKeyValue = (char*)&oh->keyboard->alternateKeyValue - (char*)&oh->keyboard;
    // ...
    

    and then with a void * to keyboard_S:

    int get_keyValue(void * _keyboard) {
        // usual way:
        // keyboard_S * keyboard = _keyboard;
        // return keyboard->keyValue;
        // requested way:
        return *(CHAR*)((char*)_keyboard + offset_of_keyboard_keyValue);
    }
    

    The type CHAR should be written in lowercase and is the type of the element keyValue. The other char must be char for every type, whatever it is. Same for the chars above in the offset_of_ variable definitions.

    So, I guess, the rest is your homework.

    0 讨论(0)
  • 2021-01-27 16:36

    More straightforward and simpler 3 Line code could be...

    //Get the address of the tesla      
      char *addressoftesla  = (laptop_S*)(&tesla);
    
    //structure of tesla = simpleMouse + qwerty + 2 byte paddings
    
    /* Get the value at the starting address of qwerty i.e keyValue*/
      printf("keyValue of tesla keyboard is %c\n",*(addressoftesla+sizeof(mouse_S)));
    
    /* Get the value at the starting address of qwerty i.e alternatekeyValue */
      printf("alternatekeyValue of tesla keyboard is %c\n",*(addressoftesla+sizeof(mouse_S)+1));
    
      /*
      * More info for further understanding: 
      * A simple check to see all the values in the each field of structure
      * tesla - you can also use sizeof to get the each structure and entire 
      * structure byte sizes and the same can be done using offsetof as in 
      * other solution
      */
      for(int i = 0; i< 12; i++)
      {
          printf("value at tesla[i] is %d \n",*(addressoftesla+i));
      }
    
    0 讨论(0)
提交回复
热议问题