| 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 的给分。。。,感觉你依旧不懂你的问题。
|
|