【发布时间】:2020-05-06 20:00:15
【问题描述】:
有这个:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct {
int a, b;
} str_t;
int main (void) {
str_t *abc = (str_t*)((((str_t*)0)->a)-offsetof(str_t,a));
return 0;
}
我已尝试做与此宏相同的操作:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
编译器没有给出任何具体的错误,但结果程序崩溃了。为什么宏也不崩溃?
【问题讨论】:
-
是编译器崩溃了,还是你的程序崩溃了?
-
你想做什么?
((str_t*)0)->a只是自找麻烦。 -
((str_t*)0)->a正在访问0附近的内存。container_of宏从不取消引用0指针,它只将它用于类型。 -
在
typeof里面。这发生在编译时,((type *)0)->member的值永远不会被访问。此构造用于获取成员的类型。 -
Re "但你通常会这么说,",不,没有人说编译器崩溃的意思是程序崩溃了。修正了这个问题。 (编译器可能会崩溃;对于像
gcc这样的成熟产品来说,这不太可能。)
标签: c pointers language-lawyer