container_of,container_of 头文件
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中。可以跨平台。