-2

可能重复:
如何在不使用 sizeof 的情况下找到变量的大小

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

4

5 回答 5

10

这是您可以使用的一个小而合法的技巧:

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

下面是它的工作原理:

  • 回想一下,添加N到指针会增加N所指向类型大小的倍数;因此(ptr+1)增加sizeof(int*)了“原始”价值ptr
  • sizeof(char)is always 1,因此转换为char*可以让您减去“原始”值;结果是操作sizeof相加的(ptr+1)
于 2012-12-20T14:49:42.663 回答
3
#define MY_SIZEOF_VAR(x) ((int)((char*)(&(x)+1)-(char*)&(x)))
#define MY_SIZEOF_TYPE(x) ((int)((char*)((x*)0+1)-(char*)0))

这远不如真实的东西好。你可能更喜欢它是一个无符号整数,但你不能太挑剔!

于 2012-12-20T14:55:57.963 回答
1

您可以检查您使用的架构。如果是 32 位架构,则指针大小为...32 位,即 4 字节。64bit arch 有 64bit, 8b 指针。

于 2012-12-20T14:46:45.840 回答
0

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

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

于 2012-12-20T14:47:02.323 回答
-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));
}
于 2012-12-20T15:01:00.657 回答