20分 |
必须声明结构体,才可以
|
必须声明一个具体的结构体吗,就像我自己试过的那样?
|
|
(int)(&(((struct card *)0)->b))
|
|
10分 |
[code = c]
struct card { char a; char b[4]; char c; }; int main(void) { printf(“%d\n”, sizeof(card::a)); //1 printf(“%d\n”, sizeof(card::b)); //4 printf(“%d\n”, sizeof(card::c)); //1 return 0; } [/ code] 查看偏移量 |
在确保结构体内部字节对齐的前提下(无无效字节),可以如楼上的楼上所说。
(int)(&(((struct card *)0)->c)) -(int)( &(((struct card *)0)->b)),若c为int的话,就不可用了。 |
|
同意 7楼, 对齐就有偏差了 通常的严谨的结构定义都是需要pack(1),即使对齐也要在结构中添加 reserve来主动对齐。 |
|
sizeof(A1.b/A1.b[0]);
|
|
sizeof(A1.b)/sizeof(A1.b[0]);
|
|
在不考虑对齐的情况下,可以使用offsetof
#include <stdio.h> #include <stddef.h> struct card { char a; char b[4]; char c; }; int main(int argc, char *argv[]) { size_t size; size = offsetof(struct card, c) - offsetof(struct card, b); printf("size=%d\n", size); return 0; } |
|
糊涂了,直接用空指针就可以了啊
sizeof(((struct card *)0)->b); |
|
10分 |
这让我想起Kernel的container_of关键技术了
#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) );}) |
LZ 的给分。。。,感觉你依旧不懂你的问题。
|