让我们假设我已经声明了某个数据类型的变量“i”(可能是 int、char、float 或 double)......
注意:只需考虑声明了“i”,如果它是 int 或 char 或 float 或 double 数据类型,请不要打扰。因为我想要一个通用的解决方案,所以我只是提到变量“i”可以是任何一种数据类型,即 int、char、float 或 double。
现在我可以在没有 sizeof 运算符的情况下找到变量“i”的大小吗?
您可以使用以下宏,取自此处:
#define sizeof_var( var ) ((size_t)(&(var)+1)-(size_t)(&(var)))
这个想法是使用指针算术 ( (&(var)+1)
) 来确定变量的偏移量,然后减去变量的原始地址,得到它的大小。例如,如果您有一个int16_t i
位于 的变量0x0002
,您将从 中减去0x0002
,0x0006
从而获得0x4
4 个字节。
但是,我真的没有看到不使用的正当理由sizeof
,但我相信你一定有一个。
自从我编写任何 C 代码以来已经很久了,而且我从来都不擅长它,但这看起来是正确的:
int i = 1;
size_t size = (char*)(&i+1)-(char*)(&i);
printf("%zi\n", size);
我相信有人可以告诉我很多为什么这是错误的原因,但它对我来说是一个合理的价值。
这有效..
int main() {
int a; //try changing this to char/double/float etc each time//
char *p1, *p2;
p1 = &a;
p2 = (&a) + 1;
printf("size of variable is:%d\n", p2 - p1);
}
int *a, *b,c,d;/* one must remove the declaration of c from here*/
int c=10;
a=&c;
b=a;
a++;
d=(int)a-(int)b;
printf("size is %d",d);
我希望下面的代码可以在不使用 sizeof() 运算符的情况下解决您在 c++ 中的问题
对于任何变量,如(int、char、float、double、char、short 等等......)
这里我取整数,
int a;
然后将其显示为字节可寻址输出,
cout<<(char *)(&a + 1) - (char *)(&a);
这应该有效。
#define xsizeof(x) (char *)(&x+1) - (char *)&x
试试这个,
#define sizeof_type( type ) ((size_t)((type*)1000 + 1 )-(size_t)((type*)1000))
对于以下用户定义的数据类型,
struct x
{
char c;
int i;
};
sizeof_type(x) = 8
(size_t)((x*)1000 + 1 ) = 1008
(size_t)((x*)1000) = 1000
这应该给你你的变量的大小
#define mySizeof(type) ((uint)((type *)0+1))
无需使用sizeof
运算符即可查找变量大小的程序
#include<stdio.h>
int main()
{
int *p,*q;
int no;
p=&no;
printf("Address at p=%u\n",p);
q=((&no)+1);
printf("Address at q=%u\n",q);
printf("Size of int 'no': %d Bytes\n",(int)q-(int)p);
char *cp,*cq;
char ch;
cp=&ch;
printf("\nAddress at cp=%u\n",cp);
cq=cp+1;
printf("Address at cq=%u\n",cq);
printf("Size of Char=%u Byte\n",(int)cq-(int)cp);
float *fp,*fq;
float f;
fp=&f;
printf("\nAddress at fp=%u\n",fp);
fq=fp+1;
printf("Address at fq=%u\n",fq);
printf("Size of Float=%u Bytes\n",(int)fq-(int)fp);
return 0;
}
#include<stdio.h>
#include<conio.h>
struct size1
{
int a;
char b;
float c;
};
void main()
{
struct size1 *sptr=0; //declared one pointer to struct and initialise it to zero//
sptr++;
printf("size:%d\n",*sptr);
getch();
}
以下语句将给出通用解决方案:
printf("%li\n", (void *)(&i + 1) - (void *)(&i));
i
是一个变量名,可以是任何数据类型(char、short、int、float、double、struct)。