不使用sizeof的数据类型的大小

sud*_*03r 19 c sizeof

比方说我有一个数据类型,X我想知道它的大小而不声明该类型的变量或指针,当然不使用sizeof运算符.

这可能吗?我想过使用标准头文件,其中包含数据类型的大小和范围,但不适用于用户定义的数据类型.

CB *_*ley 43

在我看来,这符合"如何在不使用++,+ =或+?"的情况下添加两个整数的类别.这是浪费时间.你可以尝试通过做这样的事情来避免未定义行为的怪物.

size_t size = (size_t)(1 + ((X*)0));
Run Code Online (Sandbox Code Playgroud)

请注意,我没有声明类型或指针的变量X.

  • @Stephano:这可能是你在生活中看到的最可怕的事情,但它也或多或少地通常实现了offsetof ... (8认同)
  • 哦,我的,这是我在整个程序员生活中看到的最可怕的事情...... (6认同)
  • 虽然在所有实现中保证0表示"空指针",但它不必在内部由地址0表示,在这种情况下,这将失败.C-FAQ声称确实存在这样的机器http://c-faq.com/null/machexamp.html但它们不是你可能遇到的任何东西.顺便说一句,聪明的回答.:) (4认同)
  • `(X*)0`产生一个空指针.空指针上的算术具有未定义的行为. (3认同)
  • @Charles Balley在思科采访中询问了这个问题.这不是浪费时间,也不是一个愚蠢的问题. (2认同)
  • @KeithThompson:哎呀......是的!((我保留我的评论,以便其他人不要问同样的问题,或者不直接在C++中应用相同的技术,因为C++的类型系统有点复杂)) (2认同)
  • @Nawaz:[N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.5.6,加法运算符:"如果指针操作数和结果点都是对于同一个数组对象的元素,或者超过数组对象的最后一个元素的元素,评估不应产生溢出;否则,行为是未定义的." (你会期望什么结果`(int*)NULL + 1`产生?) (2认同)

dmc*_*kee 12

看,这sizeof 语言设施.唯一的,所以它是实现这一目标的唯一便携方式.

对于某些特殊情况,您可以生成不可移植的代码,使用其他启发式来了解特定对象的大小[*](可能通过让它们跟踪自己的大小),但您必须自己完成所有的簿记.

[*]对象在一般意义上而不是OOP意义上.


小智 10

好吧,我是一个业余爱好者..但我尝试了这个问题,我得到了正确的答案,没有使用sizeof.希望这会有所帮助..我试图找到一个整数的大小.

int *a,*s, v=10;

a=&v;

s=a;

a++;

int intsize=(int)a-(int)s;

printf("%d",intsize);
Run Code Online (Sandbox Code Playgroud)

  • 但问题是这样做_without_声明一个变量或一个指向该类型变量的指针.... (2认同)

Chr*_*s K 5

这个采访问题的正确答案是"为什么我会这样做,当sizeof()为我这样做,并且这是唯一可行的方法吗?"