如何在C中不使用sizeof查找指针的大小
可能重复:如何在C中不使用sizeof查找指针的大小,c,sizeof,C,Sizeof,可能重复: 使用C语言,我们能在不使用sizeof运算符的情况下找到指针的大小吗?虽然我在谷歌搜索时在很多地方都发现了这个问题,但我找不到任何答案。任何帮助都将不胜感激。谢谢您可以查看您使用的架构。如果是32位体系结构,指针大小为…32位或4字节。64位arch有64位8b指针。编辑:嗯,我想有一个sizeof()更容易。如果可以,就用它。否则,请使用上面@dasblinkinlight的答案 如果没有sizeof,就无法不可知地找到类型平台的大小。我不明白你为什么不想用它。但是,如果您想让代
使用C语言,我们能在不使用sizeof运算符的情况下找到指针的大小吗?虽然我在谷歌搜索时在很多地方都发现了这个问题,但我找不到任何答案。任何帮助都将不胜感激。谢谢您可以查看您使用的架构。如果是32位体系结构,指针大小为…32位或4字节。64位arch有64位8b指针。编辑:嗯,我想有一个<但是,code>sizeof()更容易。如果可以,就用它。否则,请使用上面@dasblinkinlight的答案
如果没有sizeof,就无法不可知地找到类型平台的大小。我不明白你为什么不想用它。但是,如果您想让代码变得复杂、糟糕,并且依赖于平台,您可以添加预处理器语句来检查编译器和目标体系结构,并根据这一点,从已知值中找到值。这里有一个小但合法的黑客攻击,您可以使用:
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*
操作添加的(ptr+1)
sizeof
这远不如真的那么好。您可能希望它是一个无符号int,但您不能太挑剔 使用指针模拟和投射
#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));
}
#包括
结构人{
年龄、工资;
字符名[12];
字符地址[6][20];
};
typedef结构人职员;
main(){
雇员a;
员工*x,*y;
x=&a;
y=x+1;
printf(“指针算术%d\n”,(int)((int)y-(int)x));
printf(“sizeof%ld\n”,sizeof(a));
}
您指的是指针本身的大小,还是指针指向的数据类型的大小?我相信指针大小始终是恒定的-32位应用程序为4字节,64位应用程序为8字节。为什么需要这个??只是好奇而已。你可以声明一个指针数组并获取两个相邻元素之间的差异,但是把事情复杂化太多是没有意义的。不一定。有(技术上)具有不同指针大小的奇特体系结构。但比我的解决方案简单得多+1.并非所有体系结构都是如此。通常,位指的是数据总线字,而不是地址总线字@Linuxios没有那么奇特的架构,Intel架构做到了这一点。例如,实模式有1MB地址空间,但只有16位总线宽。啊哈,不知道是什么。但它应该可以在所有通用架构(i386、x86、amd64等)上工作,对吗?@dutt:x86,应该可以。可能是amd64。手臂,不知道。与其他(有些)常见的体系结构(如PPC或其他体系结构)相同。@Linuxios啊,很公平。这如何等于sizeof(int*)
?@Linuxios I缺少一个星号-现在添加它。这是C程序的标志。必须向您解释的黑客和指针操作。@EricPostpischil是的,您提供的是ptrdiff\u t
,而不是相应的无符号
类型,对吗?我读起来就像“%td代表ptrdiff_t,%tu代表未签名的ptrdiff_t”,因为没有标准的未签名的版本的ptrdiff_t
,但也许我误解了。@user1182722指针的文本表示法从根本上说是错误的,因为不同硬件平台的表示法存在严重差异。例如,在为哈佛体系结构编译的代码中(指向代码的指针和指向数据的指针不共享相同的地址空间),指针可能会添加一整个额外字节,但只能使用其中的一位。另一方面,不管底层架构如何,这个解决方案都会起作用。以“没有办法…”开头的句子是错误的。此外,“但不是官方的”也不正确。根据C标准,允许在对象之外增加一个指针,并将该指针和指向该对象的指针转换为指向char
的指针,然后减去它们。
#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));
}