Skip to content

Instantly share code, notes, and snippets.

@mepcotterell
Last active January 17, 2019 12:22
Show Gist options
  • Save mepcotterell/c188874b05f42dd2ac45a31265f5bdca to your computer and use it in GitHub Desktop.
Save mepcotterell/c188874b05f42dd2ac45a31265f5bdca to your computer and use it in GitHub Desktop.

offsetof.h

#ifndef OFFSETOF_H
#define OFFSETOF_H

#include <stdio.h>

#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)
#define EVAL_PRINTLN(stmt, spec) printf(STR(stmt)" = "STR(spec)"\n", stmt)

#endif

offsetof.c

#include <stddef.h>
#include <stdio.h>
#include "offsetof.h"

struct data {
  char * x;
  char y;
}; // data

int main() {

  EVAL_PRINTLN(sizeof(char *), %zu);
  EVAL_PRINTLN(sizeof(char), %zu);  
  
  printf("\n");  
  
  EVAL_PRINTLN(sizeof(struct data), %zu);  
  EVAL_PRINTLN((size_t) (((struct data *) 0) + 1), %zu);
  EVAL_PRINTLN((size_t) &(((struct data *) 0)[1]), %zu);  

  printf("\n");
  
  EVAL_PRINTLN((size_t) &((struct data *) 0)->y, %zu);  
  EVAL_PRINTLN(offsetof(struct data, y), %zu);  

  return 0;
  
} // main

Output with Notes

sizeof(char *) = 8
sizeof(char) = 1

sizeof(struct data) = 16                 // why not 9!?
(size_t) (((struct data *) 0) + 1) = 16
(size_t) &(((struct data *) 0)[1]) = 16

(size_t) &((struct data *) 0)->y = 8
__builtin_offsetof (struct data, y) = 8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment