#include <stddef.h>
#include <iostream>
using namespace std;

// https://w...content-available-to-author-only...t.org/confluence/display/seccode/EXP08-C.+Ensure+pointer+arithmetic+is+used+correctly

struct big {
	unsigned long long ul1_1; // 8
	unsigned long long ul1_2; // 8
	unsigned long long ul1_3; // 8
	int si_4; // 4
	int si_5; // 4
};

void getAdrs(void *p) {
	cout << p << endl;
}

int main() {
	size_t skip = offsetof(struct big, ul1_2);

	struct big *s = (struct big *)malloc(sizeof(struct big));

	cout << skip << endl; // 8

	getAdrs(s               ); // 0x9a38008 
	getAdrs(s + skip        ); // 0x9a38108 (+256)
//	getAdrs((char *)s + skip); // 0x9a38010 (+2)
	getAdrs((char *)s + skip); // 0x9a38010 (+8 NOT +2) // modified 

	unsigned long long val[4];
	getAdrs(&val[0]); // 0xbfacc0f0
	getAdrs(&val[1]); // 0xbfacc0f8 (+8)
	getAdrs(&val[2]); // 0xbfacc100 (+16)
	
	free(s);
	s = NULL;

	return 0;
}