Skip to content

Instantly share code, notes, and snippets.

@hadashiA
Created July 14, 2012 06:44
Show Gist options
  • Save hadashiA/3109742 to your computer and use it in GitHub Desktop.
Save hadashiA/3109742 to your computer and use it in GitHub Desktop.
構造体のメンバのアドレスとオフセットを元にして、構造体先頭のポイントを得る技の実験
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef enum {
kJigokuTileFlagNone = 0,
kJigokuTileFlagCollision = 1,
kJigokuTileFlagItem = (1 << 1),
kJigokuTileFlagNPC = (1 << 2),
kJigokuTileFlagEnemy = (1 << 3),
} JigokuTileFlags;
typedef int Entity;
typedef struct t_jigoku_tile_object {
JigokuTileFlags flags;
Entity *entity;
} jigoku_tile_object;
int main(int argc, char **argv) {
Entity *entity = (Entity *)malloc(sizeof(Entity));
printf("entity:%p\n", entity);
// ふつうに初期化した構造体
jigoku_tile_object tile_obj = { kJigokuTileFlagEnemy, entity };
printf("obj:%p flags:%d entity:%p\n",
&tile_obj,
tile_obj.flags,
tile_obj.entity);
unsigned long offset2 = (unsigned long)(&((jigoku_tile_object *)0)->entity);
printf("offset2: %ld entity: %p\n", offset2, &tile_obj.entity);
printf("-offset : %p\n", (char *)(tile_obj.entity) - offset2);
// バイト数のオフセットをもとにアドレスを求めて、得た構造体
jigoku_tile_object *tile_obj_dynamic =
(jigoku_tile_object *)(((char *)(tile_obj.entity)) - offset2);
// 得られてなかった。よく考えたらentityメンバはヒープにとるとアドレスが変わるのはあたりまえか。
// Objective-C ではcのlist_headみたいなことは難しそう
printf("obj:%p flags:%d entity:%p\n",
tile_obj_dynamic,
tile_obj_dynamic->flags,
tile_obj_dynamic->entity);
free(entity);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment