可能重复:
How to find the size of a variable with out using sizeof
使用C,我们可以在不使用sizeof运算符的情况下以某种方式找到指针的大小吗?虽然我在google搜索时在很多地方发现了这个问题,但我找不到任何答案。任何帮助将不胜感激。感谢
答案 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));
}