如何使用sizeof找出变量的大小

cod*_*eak 2 c sizeof

让我们假设我已经声明了某个数据类型的变量'i'(可能是int,char,float或double)......

注意:只需考虑声明'i',如果是int或char或float或double数据类型,则不要打扰.由于我想要一个通用的解决方案,我只是简单地提到变量'i'可以是任何一种数据类型,即int,char,float或double.

现在我可以找到没有sizeof运算符的变量'i'的大小吗?

Joã*_*lva 21

您可以使用下面的宏,取自这里:

#define sizeof_var( var ) ((size_t)(&(var)+1)-(size_t)(&(var))) 
Run Code Online (Sandbox Code Playgroud)

我们的想法是使用指针arithmetic((&(var)+1))来确定变量的偏移量,然后减去变量的原始地址,从而产生其大小.例如,如果你有一个int16_t i位于变量0x0002,你将被减去0x00020x0006,从而获得0x4或4个字节.

但是,我没有真正看到不使用的正当理由sizeof,但我相信你必须有一个.

  • 如果地址在 `size_t` 中无法表示(例如分段架构),这可能会导致未定义的行为,并且也不能保证返回正确的大小 (3认同)
  • 该死的......尝试并为我多年来的第一个 C 代码获得正确的语法让我变慢了 ;-) (2认同)

Joa*_*uer 6

自从我编写任何C代码以来已经很久了,我从来都不擅长它,但这看起来是正确的:

int i = 1;
size_t size = (char*)(&i+1)-(char*)(&i);
printf("%zi\n", size);
Run Code Online (Sandbox Code Playgroud)

我相信有人可以告诉我为什么这是错误的,但它为我打印了一个合理的价值.

  • 使用(char*)代替(void*)将避免编译器关于void*算法的警告并且确实给出相同的结果,因为char总是大小为1. (3认同)
  • 您唯一需要修复的是将 `void *` 更改为 `char *` - 你不应该使用 `void *` 进行指针运算。 (2认同)
  • 这适用于具有字节可寻址内存的处理器.我不确定这是否适用于DSP56300系列处理器,其中char和int都存储在各个24位宽的存储器位置.处理器没有字节寻址,因此连续字符或整数的指针值之间的差异都是1. (2认同)
  • @Ian:无关紧要.`sizeof`是根据`char`单位定义的,因此结果是正确的.如果你的实现使用24位字符但人为地限制它们到8位范围,那么它不是C.C要求`char`没有填充位. (2认同)