細嚼慢嚥containerof

2021-09-10 02:10:15 字數 2345 閱讀 6760

簡單版本:

乙個朋友說在keil裡想使用container_of函式,

在了解了container_of的作用之後,自己寫了乙個,並且已經測試通過。

首先,container_of的作用是從包含在某個結構中的指標獲得結構本身的指標,

通俗地講就是通過結構體變數中某個成員的首位址進而獲得整個結構體變數的首位址。

container_of(ptr, type, member)

ptr:表示結構體中member的位址

type:表示結構體型別

member:表示結構體中的成員

通過ptr的位址可以返回結構體的首位址

實現:#define container_of(ptr, type, member) ((type*)((ptr) - &(((type*)0)->member)))

測試://定義測試結構體

struct test_struct ;

int main(void)

; char *ptr_ch = &init_struct.ch; //知道此結構體中ch成員的位址

ptest_struct = container_of(ptr_ch,struct test_struct,ch);

printf("init_struct =%p\n",&init_struct);

printf("ptest_struct =%p\n",ptest_struct);

printf("init_struct.num = %d\n",ptest_struct->num);

printf("init_struct.ch = %c\n",ptest_struct->ch);

printf("init_struct.f1 = %f\n",ptest_struct->f1);

return 0;

}測試結果

專業版本:

#include#include typedef unsigned char  uint8_t;

typedef unsigned short uint16_t;

typedef unsigned int uint32_t;

typedef unsigned long long uint64_t;//注意:微控制器的u64是long long 列印是llx 不是long -lx

//#define container_of(ptr, type, member) ((type*)((ptr) - &(((type*)0)->member)))

#include#include#include#define offsetof(type, member) ((size_t) &((type*)0)->member)

/*ptr 成員指標

* type 結構體 比如struct stu

* member 成員變數,跟指標對應

* */

#define container_of(ptr, type, member) ()

typedef struct stu*p_stu,str_stu;

void print_all(void *p_str)

struct st

*p_st,n_st;

typedef st t_st;

int main(void)

); printf("aa=%d\n",aa );//知識1:

typeof(aa) bb=8;//知識2:

printf("bb=%d\n",bb );

printf("%p\n",&((struct st *)0)->c );

printf("%p\n",&((t_st *)0)->b);//知識:尺子放在0位置

m_stu->age = 25;

m_stu->id = 1;

m_stu->name[0]='w';

m_stu->name[1]='e';

m_stu->name[2]='i';

m_stu->name[3]='q';

m_stu->name[4]='i';

m_stu->name[5]='f';

m_stu->name[6]='a';

m_stu->name[7]='\0';

m_stu->phone_num=13267;

/*傳結構體成員指標進去*/

print_all(&m_stu->age);

printf("main end\n");

if(m_stu!=null)

free(m_stu);

return 0;

}