我已经尝试实施sizeof运算符..我已经这样做了..
#define my_sizeof(x) ((&x + 1) - &x)
但是最终总是以任一数据types给出结果为'1'。
我已经为此search了它..我发现代码typecasted
#define my_size(x) ((char *)(&x + 1) - (char *)&x)
而代码工作,如果它是typecasted ..我不明白为什么..这个代码也填充结构完美..
C ++名称是否具有确定性(装饰)?
AxWindowsMediaPlayer剪辑有时不会播放
目录path由句柄
为什么更新基于随机值的计时器?
Unix编程共享内存奇怪的结果
它也在为
#define my_sizeof(x) (unsigned int)(&x + 1) - (unsigned int)(&x)
任何人都可以请解释它是如何工作,如果typecasted,如果没有typecasted?
提前致谢..
是否可以根据/ proc / self / maps中的信息执行munmap?
自定义窗口devise
Linux(gcc)和Windows(mingw32 gcc)之间结构体的大小与位域不同
针对这种小型数据/命令广播应用的build议networking拓扑结构?
为什么包含带有外部variables和funcs的h文件会导致未定义的引用
指针减法的结果是在元素中 ,而不是以字节为单位。 因此,第一个表达式按照定义评估为1 。
除此之外,你真的应该在宏中使用圆括号:
#define my_sizeof(x) ((&x + 1) - &x) #define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
否则,在表达式中尝试使用my_sizeof()会导致错误。
但总是以数据类型的结果为“1”结束
是的,这就是指针算法的工作原理。 它以所指向的类型为单位进行工作。 所以铸造到char *工程单位的char ,这是你想要的。
sizeof运算符是C(和C ++)语言规范的一部分,在编译器(前端)中实现。 没有办法用其他C构造来实现它(除非你使用类似typeof的 GCC扩展),因为它可以接受任何类型或表达式作为操作数,而不会产生任何副作用(例如sizeof((i>1)?i:(1/i))不会崩溃,当i==0但你的宏my_sizeof将崩溃与零除)。 另请参阅C编码准则和维基百科 。
您应该了解C 指针算术 。 看到这个问题 。 指针差异以元素而不是字节表示。
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
在以下情况下,这个my_sizeof()宏不起作用:
sizeof 1 – 4字节(对于4字节int的平台)
my_sizeof(1) – 根本不会编译。
sizeof (int) – 4字节(用于4字节int的平台)
my_sizeof(int) – 根本不会编译代码。
它只能用于变量。 它不适用于像int , float , char等数据类型,像2,3.4, 'A'等文字,也不适用于像a+b或foo()这样a+b右值表达式。
#define my_sizeof(x) ((&x + 1) - &x)
&x给出程序中声明的变量的地址(可以说是double x),并用1递增它给出地址,其中类型x的下一个变量可以被存储(这里addr_of(x) + 8 ,大小为a双是8Byte)。
不同的结果是x的类型有多少个变量可以存储在这个内存量中,对于x类型来说显然是1(用1来递增,而不同的是我们所做的)。
#define my_size(x) ((char *)(&x + 1) - (char *)&x)
将其转换为char* ,并将差异告诉我们在给定的内存空间中可以存储多少个类型为char变量(差异)。 由于每个char仅需要1字节的内存,因此(内存量)/ 1将给出传递给宏的变量类型的两个连续内存位置之间的字节数,因此x类型的变量需要。
但是你不能将任何文字传递给这个宏,并知道它们的大小。
#define my_sizeof(x)((&x + 1) – &x)
&x给出你的变量的地址,并用一个(&x + 1)递增它,给出地址,在那里可以存储另一个x类型的变量。 现在,如果我们对((&x + 1) – &x)这些地址进行算术运算,那么它将会告诉在((&x + 1) – &x)地址范围内,可以存储1个x类型的变量。
现在,如果我们使用(char *)[因为char的大小是1个字节并且增加一个char *只会移动一个字节]来对这些内存进行类型转换,那么我们将得到类型x消耗的字节数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。