我被问到这是面试问题。无法回答。
编写C程序以查找结构大小而不使用
sizeof
运算符。
答案 0 :(得分:12)
struct XYZ{
int x;
float y;
char z;
};
int main(){
struct XYZ arr[2];
int sz = (char*)&arr[1] - (char*)&arr[0];
printf("%d",sz);
return 0;
}
答案 1 :(得分:4)
这是另一种方法。 它还没有完全定义,但仍然适用于大多数系统。
typedef struct{
// stuff
} mystruct;
int main(){
mystruct x;
mystruct *p = &x;
int size = (char*)(p + 1) - (char*)p;
printf("Size = %d\n",size);
return 0;
}
答案 2 :(得分:1)
这是两种形式的sizeof
的两个宏版本(采用类型与接受变量),您可以将这些代码用于您不允许使用的所有代码{{{ 1}}:
sizeof
也许有一些深刻的魔法,你可以把它们组合成一个宏,它几乎可以作为所有这些#define type_sizeof(t) (size_t)((char *)((t *)1024 + 1) - (char *)((t *)1024))
#define var_sizeof(v) (size_t)((char *)(&(v) + 1) - (char *)&(v))
- 代码中的替代品。 (太糟糕了,你无法修复多重评估错误。)
答案 3 :(得分:1)
这是另一种方法......不需要创建任何结构实例。
struct XYZ{
int x;
float y;
char z;
};
int main(){
int sz = (int) (((struct XYZ *)0) + 1);
printf("%d",sz);
return 0;
}
它是如何运作的?
((struct XYZ *)0) + 1 = zero + size of structure
= size of structure
答案 4 :(得分:0)
对于喜欢C宏样式编码的人来说,这是我对此的看法:
#define SIZE_OF_STRUCT(mystruct) \
({ struct nested_##mystruct { \
struct mystruct s; \
char end[0]; \
} __attribute__((packed)) var; \
var.end - (char *)&var; })
void main()
{
struct mystruct {
int c;
};
printf("size %d\n", SIZE_OF_STRUCT(mystruct));
}
答案 5 :(得分:0)
struct ABC
{
int a, b[3];
int c;
float d;
char e, f[2];
};
int main()
{
struct ABC *ptr=(struct ABC *)0;
clrscr();
ptr++;
printf("Size of structure is: %d",ptr);
return 0;
}
答案 6 :(得分:-2)
struct ABC
{
int a;
float b;
char c;
};
void main()
{
struct ABC *ptr=(struct ABC *)0;
ptr++;
printf("Size of structure is: %d",*ptr);
}