container_of,container_of 头文件

http://www.itjxue.com  2023-01-07 01:46  来源:未知  点击次数: 

C语言程序container_of问题

container_of是内核的一个宏。

你现在的错误是未定义这个宏导致的

可以自己手动添加这个宏

#includestdio.h

#includestddef.h

#include?stdlib.h

typedef?struct

{

int?num;

char?a;

}node;

#define?container_of(ptr,?type,?member)?({??????????????????????\

????????const?typeof(((type?*)?0)-member)?*__mptr?=?(ptr);?????\

????????(type?*)?((char?*)?__mptr?-?offsetof(type,?member));})??

??

#define?container_of2(ptr,?type,?member)?({??????????????????????\

????????(type?*)?((char?*)?ptr?-?offsetof(type,?member));})??

void?main()

{

node*?p?=?(node*)malloc(sizeof(node));

p-num?=?1;

p-a?=?'a';

printf("offsetof:%lu\n",offsetof(node,num));

printf("addr:%lu\n",p);

printf("containerof:%lu\n",container_of((p-a),?node,?a));

}

编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织到链表中

int main()

{

Link head; //链表(不带头节点)

int n;

printf("输入链表的长度n: ");

scanf("%d",n);

printf("连续输入%d个数据(以空格隔开): ",n);

head=CreateLink(n);

printf("\n原本链表的节点是: ");

DispLink(head);

LinkSort(head);

printf("\n从大到小排序之后: ");

DispLink(head);

printf("\n");

return 0;

}

链表的具体存储表示为:

① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)

② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

以上内容参考:百度百科-单链表

c语言中container_of, typeof, offsetof这些是哪个标准的?

1. container_of是Linux内核中实现的宏,不是C语言的标准函数。不能跨平台。

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

const typeof( ((type *)0)-member ) *__mptr = (ptr); \

(type *)( (char *)__mptr - offsetof(type,member) );})

2. typeof是GNU C的扩展,不是ISO标准中的函数。用gcc编译可以跨平台。

3. offsetof是C语言标准库中的宏,定义在头文件stddef.h中。可以跨平台。

(责任编辑:IT教学网)

更多

推荐免费资源文章