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

C语言 码拜 6年前 (2015-05-11) 333次浏览 0个评论

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

如果不建立结构体A1,如何得到呢?

20分
必须声明结构体,才可以
必须声明一个具体的结构体吗,就像我自己试过的那样?
试试这个呢?
sizeof(card::b);
c++里新增了,不知道c语言里怎么样
(int)(&(((struct card *)0)->b))
(int)(&(((struct card *)0)->b)) 获得b开始地址,(int)(&(((struct card *)0)->c)) 获得c开始地址

答案就是:(int)(&(((struct card *)0)->c))  – (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]

查看偏移量
[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]

在确保结构体内部字节对齐的前提下(无无效字节),可以如楼上的楼上所说。

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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c语言如何求得结构体内某个元素的长度
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!