c语言如何求得结构体内某个元素的长度

掌中星空 2015-03-29 01:11:06
我建立了一个结构体类型:
struct card
{
char a;
char b[4];
char c;
};
如何得到结构体内元素 b[4]的长度?
我试过用下面的形式得到数组b的长度。
main()
{
char a;
struct card A1;
a=sizeof(A1.b);
}

如果不建立结构体A1,如何得到呢?
...全文
826 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
子善旬 2015-05-16
  • 打赏
  • 举报
回复
LZ 的给分。。。,感觉你依旧不懂你的问题。
mymtom 2015-04-08
  • 打赏
  • 举报
回复
糊涂了,直接用空指针就可以了啊

sizeof(((struct card *)0)->b);
mymtom 2015-04-08
  • 打赏
  • 举报
回复
在不考虑对齐的情况下,可以使用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;
}
一根烂笔头 2015-04-08
  • 打赏
  • 举报
回复
这让我想起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) );})
hyz_cs 2015-04-06
  • 打赏
  • 举报
回复
sizeof(A1.b)/sizeof(A1.b[0]);
hyz_cs 2015-04-06
  • 打赏
  • 举报
回复
sizeof(A1.b/A1.b[0]);
子善旬 2015-04-06
  • 打赏
  • 举报
回复
同意 7楼, 对齐就有偏差了 通常的严谨的结构定义都是需要pack(1),即使对齐也要在结构中添加 reserve来主动对齐。
d741963250 2015-03-29
  • 打赏
  • 举报
回复
在确保结构体内部字节对齐的前提下(无无效字节),可以如楼上的楼上所说。 (int)(&(((struct card *)0)->c)) -(int)( &(((struct card *)0)->b)),若c为int的话,就不可用了。
苏叔叔 2015-03-29
  • 打赏
  • 举报
回复
[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] 查看偏移量 [code = c] struct card { char a; char b[4]; char c; }; int main(void) { printf("%d\n", offsetof(struct card, a)); //0 printf("%d\n", offsetof(struct card, b)); //1 printf("%d\n", offsetof(struct card, c)); //5 printf("%d\n", sizeof(struct card)); //6 system("pause"); return 0; } [/ code]
子善旬 2015-03-29
  • 打赏
  • 举报
回复
(int)(&(((struct card *)0)->b)) 获得b开始地址,(int)(&(((struct card *)0)->c)) 获得c开始地址 答案就是:(int)(&(((struct card *)0)->c)) - (int)(&(((struct card *)0)->b))
子善旬 2015-03-29
  • 打赏
  • 举报
回复
(int)(&(((struct card *)0)->b))
ri_aje 2015-03-29
  • 打赏
  • 举报
回复
试试这个呢? sizeof(card::b); c++里新增了,不知道c语言里怎么样
掌中星空 2015-03-29
  • 打赏
  • 举报
回复
必须声明一个具体的结构体吗,就像我自己试过的那样?
relaxisland 2015-03-29
  • 打赏
  • 举报
回复
必须声明结构体,才可以

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧