fork download
  1. #include <stddef.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. // https://w...content-available-to-author-only...t.org/confluence/display/seccode/EXP08-C.+Ensure+pointer+arithmetic+is+used+correctly
  6.  
  7. struct big {
  8. unsigned long long ul1_1; // 8
  9. unsigned long long ul1_2; // 8
  10. unsigned long long ul1_3; // 8
  11. int si_4; // 4
  12. int si_5; // 4
  13. };
  14.  
  15. void getAdrs(void *p) {
  16. cout << p << endl;
  17. }
  18.  
  19. int main() {
  20. size_t skip = offsetof(struct big, ul1_2);
  21.  
  22. struct big *s = (struct big *)malloc(sizeof(struct big));
  23.  
  24. cout << skip << endl; // 8
  25.  
  26. getAdrs(s ); // 0x9a38008
  27. getAdrs(s + skip ); // 0x9a38108 (+256)
  28. // getAdrs((char *)s + skip); // 0x9a38010 (+2)
  29. getAdrs((char *)s + skip); // 0x9a38010 (+8 NOT +2) // modified
  30.  
  31. unsigned long long val[4];
  32. getAdrs(&val[0]); // 0xbfacc0f0
  33. getAdrs(&val[1]); // 0xbfacc0f8 (+8)
  34. getAdrs(&val[2]); // 0xbfacc100 (+16)
  35.  
  36. free(s);
  37. s = NULL;
  38.  
  39. return 0;
  40. }
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
8
0x968a008
0x968a108
0x968a010
0xbfe55320
0xbfe55328
0xbfe55330