Làm sao để "container_of" macro làm việc

Làm sao để "container_of" macro làm việc & một ví dụ**

Ở đây tôi đưa ra một ví dụ nhỏ về container_of macro:
Macro container_of được định nghĩa trong linux /kernel.h
syntax: container_of( pointer, container_type, container_field );
code:
file main.c

#include <stdio.h>
#include <stdlib.h>

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({            \
 const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
(type *)( (char *)__mptr - offsetof(type,member) );})

struct test1 {
    int a;
};
    struct test2 {
    int b;
    struct test1 z;
    int c;
};
int main()
{
   /* existing structure */
   struct test2 *obj;
   obj = malloc(sizeof(struct test2));
   if(obj == NULL){
         printf("Error: Memory not allocated...!\n");
   }
   obj->z.a = 51;
   obj->b = 100;
   obj->c = 53;

   /* pointer to existing entry */    
   struct test1 *obj1 = &obj->z;
   struct test2 *obj2 = container_of(obj1, struct test2, z);
   printf("obj2->b = %d\n", obj2->b);

   return 0;
}

compile: $ gcc -o main main.c
output: ./main
obj2->b = 100

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ĐiTIm

1 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
1 0
sudo du sh
t viết hơn 3 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!