#include <stdio.h>
typedef struct _object {
char base;
} PyObject;
typedef struct {
char base;
int val;
} PyIntObject;
#if 0
typedef struct {
int val;
char base;
} PyIntObject;
#endif
void print_base(PyObject *obj) {
printf("obj->base : %c\n", obj->base);
}
int main() {
printf("sizeof(PyObject) : %ld\n", sizeof(PyObject)); // 1
printf("sizeof(PyIntObject) : %ld\n", sizeof(PyIntObject)); // 8
PyIntObject intObject = {'a', 999};
// print_base(&intObject); expected ‘PyObject * {aka struct _object *}’ but argument is of type ‘PyIntObject * {aka struct <anonymous> *}’
print_base((PyObject *)&intObject);
return 0;
}
output
sizeof(PyObject) : 1
sizeof(PyIntObject) : 8
obj->base : a
PyObject的结构体大小为1, 而PyIntObject为8,不同size的内存大小也是也可正确强制类型转化使用的。
void print_base(PyObject *obj) {
printf("obj->base : %c\n", obj->base);
}
需要传进来一个PyObject类型的指针,调用的时候,
print_base((PyObject *)&intObject);
直接强制转换,当然,这样的前提是结构体的内存分配的前一部分必须要和父类一致,才能正确的调用。
如果改为
typedef struct {
int val;
char base;
} PyIntObject;
obj->base
读取的内存就不是char base
了
网友评论