user-0 提问: 怎样用sizeof来表达结构中某一个字段的大小？

回复:
user: user-1
content: 用减法 sizeof( INDEX ) - sizeof( int )    不就行了？ 鄙视赵老师刷分

user: user-2
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-3
content: 参考  1 楼的 得出这个，不知是否合适LZ #include <stdio.h>  typedef struct ST_INDEX { int offset; char c[4]; }INDEX;  void main() { 	INDEX A;  	printf("1: %d\n",sizeof(((INDEX*)0)->c));  	printf("2: %d\n",sizeof(A.c)); }

user: user-4
content: //  c++可以这么写，c语言就不太好搞了 #include "stdio.h" typedef struct _INDEX {  	int nlen; 	int offset; 	char c[4];  	_INDEX() 	{ 		nlen = sizeof(c); 	} }INDEX; void main() {  }

user: user-5
content: 引用 5 楼 baichi4141 的回复:[quote=引用 4 楼 supermegaboy 的回复:] [quote=引用 1 楼 justin_bkdrong 的回复:] 使用宏就可以比如 #define INDEX_VAR_SIZE(name) sizeof(((INDEX*)0)->name)就可以达到您的要求。  (INDEX*)0->name实际上是错误行为，属于未定义行为。[/quote] sizeof内的表达式在编译时直接忽略的吧？[/quote]  晕，没留意前面有个sizeof，这里是没问题的。

user: user-6
content: (INDEX*)0->name 虽然表面看是一个取地址内的值,但是前面加入sizeof之后，这个地址不会被访问，而编译器仅仅取了INDEX 结构中的成员变量的大小。这个运行是完全正确的。

user: user-7
content: 引用 4 楼 supermegaboy 的回复:[quote=引用 1 楼 justin_bkdrong 的回复:] 使用宏就可以比如 #define INDEX_VAR_SIZE(name) sizeof(((INDEX*)0)->name)就可以达到您的要求。  (INDEX*)0->name实际上是错误行为，属于未定义行为。[/quote] sizeof内的表达式在编译时直接忽略的吧？

user: user-5
content: 引用 1 楼 justin_bkdrong 的回复:使用宏就可以比如 #define INDEX_VAR_SIZE(name) sizeof(((INDEX*)0)->name)就可以达到您的要求。  (INDEX*)0->name实际上是错误行为，属于未定义行为。

user: user-8
content: 为什么要考虑外面的结构？你只是计算字段的大小，只考虑该字段就可以了吧，数组的大小可以=sizeof（char）*4 即sizeof（数组类型）*数组大小。

user: user-9
content: 我个人想到的是这种办法：  #include<stdio.h>  typedef struct { 	int offset; }S_OFFSET; typedef struct { 	char c[4]; }S_C; typedef struct  { 	S_OFFSET offset; 	S_C c; }INDEX;  int main() { 	printf("%d\n", sizeof(S_C)); 	return 0; }  引用 楼主 screen12 的回复:比如有这样一个结构： struct INDEX { 	int offset; 	char c[4]; };  我现在想表达出第二个字段c[4]的大小，只能用它的一个具体的变量 INDEX index[10000];  然后用sizeof(index[0].c)来表示大小。  可是我觉得这样不是很方便，因为表达式比较长，而且还得具体到index[0]。  如果是整个结构的大小可以用sizeof(INDEX)来表达。可是它的一个字段用什么来表达大小比较方便呢？  sizeof(INDEX.c)好象非法？

user: user-6
content: 使用宏就可以比如 #define INDEX_VAR_SIZE(name) sizeof(((INDEX*)0)->name)就可以达到您的要求。