如何在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));
}