这里是不使用sizeof关键字返回struct大小的代码
#include <iostream>
using namespace std;
struct point{
int x;
int y;
};
struct point pt={0,0};
int main(){
point *ppt=&pt;
unsigned char *p1,*p2;
p1=(unsigned char *)ppt;
p2=(unsigned char *)++ppt;
printf("%d",p2-p1);
return 0;
}
它返回8,因为我理解因为sizeof char是1个字节,这个结构包含整数类型首先它使用char指针将它转换为char并返回sizeof char?或者?我不明白它是如何工作的 谢谢
答案 0 :(得分:4)
这里的演员阵容发生在++
之后p2 = (unsigned char *)++ppt;
它的工作原理是因为指针上的++会增加指针的字节数等于指向的类型的大小。然后你转换为char,因为minus将指针的差异除以类型的大小(因此它除以1,因为它现在是char *)。
如果您打算使用此函数,请注意一点 - sizeof绝对是在编译时完成的,其中优化程序可能会将此代码识别为常量表达式。
另外,正如评论者和其他问题所指出的,如果类型需要对齐,它将不匹配sizeof(某些系统要求类型从可被2,4整除的内存边界开始)。
最后,(从评论中),一旦指针递增,它就是无效的,不能被使用(即使是减法,比较 - 即使是不会取消引用它的方式)
来自C Rationale文档: http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf
标准中含有隐含的概念 无效指针。在讨论 指针,典型的标准 指的是“指向对象的指针”或 “指向函数的指针”或“null 指针。“地址中的一个特例 算术允许指针指向 刚刚结束数组。任何 其他指针无效。
可能会在中创建无效指针 几种方式。任意值都可以 被分配(通过演员)到指针 变量。 (这甚至可以创造一个 有效指针,取决于 value。)指向对象的指针变为 如果内存包含无效则无效 对象被释放或移动 realloc的。指针算术可以 产生指针范围之外的指针 一个数组。
无论指针是多么无效 创造,任何使用它产生 未定义的行为。即使是任务, 与空指针比较 不变,或与自身比较, 在一些系统上可能导致一个 异常。
考虑一个假设的分段 指针上的体系结构 包括段描述符和 偏移。假设片段是 比较小的大阵列 分配在多个部分。 虽然细分是有效的 (已分配,映射到实际内存), 硬件,操作系统或C. 实现可以使这些倍数 段的行为类似于单个对象: 指针算术和关系 运算符使用定义的映射 对...施加适当的命令 数组的元素。一旦记忆 被取消分配,映射是否定的 更长的保证存在。使用的 段描述符现在可能会导致 异常或硬件寻址 逻辑可能会返回无意义的数据。
答案 1 :(得分:0)
struct ABC{
int a;
float b;
char c;
};
int main(){
struct ABC *ptr=(struct ABC *)0;
ptr++;
printf("Size of structure is: %d",*ptr);
return 0;
}
这是另一种在不使用struct
的情况下查找sizeof
大小的方法。