如何在C中不使用sizeof来查找指针的大小

时间:2012-12-20 14:44:43

标签: c sizeof

  

可能重复:
  How to find the size of a variable with out using sizeof

使用C,我们可以在不使用sizeof运算符的情况下以某种方式找到指针的大小吗?虽然我在google搜索时在很多地方发现了这个问题,但我找不到任何答案。任何帮助将不胜感激。感谢

5 个答案:

答案 0 :(得分:9)

这是一个可以使用的小但合法的黑客:

int *unused = NULL;
int **ptr = &unused;
printf("%tu\n", ((char*)(ptr+1))-(char*)ptr);

以下是它的工作原理:

  • 回想一下,向指针添加N会增加N次指向的类型的大小;因此(ptr+1)sizeof(int*)添加到ptr
  • 的“原始”值
  • sizeof(char)始终为1,因此转换为char*可让您减去“原始”值;结果是sizeof操作添加了(ptr+1)

答案 1 :(得分:3)

#define MY_SIZEOF_VAR(x) ((int)((char*)(&(x)+1)-(char*)&(x)))
#define MY_SIZEOF_TYPE(x) ((int)((char*)((x*)0+1)-(char*)0))

这远远不如真实的东西。你可能更喜欢它是一个unsigned int,但你不能太挑剔!

答案 2 :(得分:1)

您可以查看您所在的架构。如果它是32位架构,则指针大小为...... 32位或4字节。 64位拱有64位,8b指针。

答案 3 :(得分:0)

编辑:嗯,我猜有一个。 sizeof()仍然比较容易。如果可以,请使用它。否则,请使用@ dasblinkinlight上面的答案。

如果没有sizeof,就无法找到类型平台的大小。我不知道为什么你不想使用它。但是,如果您愿意使代码变得复杂且糟糕,并且依赖于平台,则可以添加预处理程序语句来检查编译器和目标体系结构,并根据这些内容从已知值中查找值。

答案 4 :(得分:-2)

使用指针算法和转换

#include <stdio.h>

struct person {
  int age, salary;
  char name[12];
  char address[6][20];

      };

typedef struct person EMPLOYEE;

main() {
EMPLOYEE a;
EMPLOYEE *x,*y;

x=&a;
y=x+1;
printf ("pointer arith %d\n", (int)((int)y-(int)x));
printf ("sizeof %ld\n", sizeof(a));
}