使用 C,我们可以在不使用 sizeof 运算符的情况下以某种方式找到指针的大小吗?虽然我在谷歌搜索时在很多地方发现了这个问题,但我找不到任何答案。任何帮助将不胜感激。谢谢
问问题
5551 次
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 always1
,因此转换为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 回答