c語言實現類似繼承的機制 位元組對齊補0的影響

2021-09-10 22:15:08 字數 1278 閱讀 5204

#include int main(void)

; struct c

;struct a

p,*pp;

printf("sizeof(): int: %lu, a: %lu, b: %lu c: %lu\n", sizeof(int), sizeof(struct a), sizeof(struct b), sizeof(struct c));

int d = 2;

printf("d: %p\n", &d);

struct b b = ;

struct b *b_1 = &b;

pp = (struct a*)(b_1); // 給大結構體裡的小結構體賦值

printf("pp的數值, %d,%c,%d\n", (pp->b).a, (pp->b).b, *((pp->b).c)); // 完全正確,賦值

printf("列印位址, %p,%p,%p\n", &((pp->b).a), ((pp->b).c), &((pp->b).b));

struct c *c_1 = null;

c_1 = (pp->c);

printf("c_1: %p\n", c_1);

if (pp && c_1)

return 0;

}

輸出為(64bit機器,8位元組對齊,gcc):

sizeof(): int: 4, a: 32, b: 24 c: 24

d: 0x7fff217995b4

pp的數值, 3,a,2

列印位址, 0x7fff217995d0,0x7fff217995b4,0x7fff217995e0

c_1: (nil)(**被補了0,導致接下來指標為null**)

sizeof(): int: 4, a: 32, b: 24 c: 24

只更改下面部分

struct b        ;..

struct b b = ;

輸出

sizeof(): int: 4, a: 24, b: 16 c: 24

d: 0x7ffd866a7b44

pp的數值, 3,a,2

列印位址, 0x7ffd866a7b60,0x7ffd866a7b44,0x7ffd866a7b64

c_1: 0x7ffd866a7c60

a:1 b: c:0x7ffd866a8fda

C語言實現繼承與多型

在前面部落格已經詳細講過c 中繼承與多型的概念,在這裡則只使用c語言的語法來實現繼承與多型。繼承 即派生類中擁有基類的成員變數和成員函式,所以c語言實現如下 include typedef void func void void funb typedef struct b b typedef str...

C語言實現繼承和多型

一 面向過程程式設計與物件導向程式設計的區別 眾所周知,c語言是一種典型的面向過程程式語言,而c 確實在它的基礎上改進的一款物件導向程式設計語言,那麼,面向過程與物件導向到底有什麼樣的區別呢?從設計方法角度看 面向過程程式設計方法採用函式 或過程 來描述對資料的操作,但又將函式與其操作的資料分離開來...

C語言實現單繼承 inheritance

namedpoint.h ifndef namedpoint h define namedpoint h struct namedpoint typedef struct namedpoint namedpoint namedpoint makenamedpoint double x,double ...