在C语言中获取指针的大小

30

如何使用 sizeof 在C语言中获取指针的大小?我想要动态分配内存来存储指针本身(而不是所指向的值)。


6
据我所知,不同类型的指针并不能保证拥有相同的大小。 - SLaks
真的吗?你能提供一个例子/来源吗?我一直以为所有指针的大小都是相同的,因为它们都引用了同一地址空间内的内存位置。 - Matt
5
一个微不足道的反例是函数指针;它可能不是相同的地址空间。请参阅:https://dev59.com/InNA5IYBdhLWcg3wjOpS。 - Oliver Charlesworth
1
标准C规定对象指针的大小都相同,但不要求函数指针的大小与对象指针相同(请记住80286和小型、中型、大型、巨型内存模型等)。POSIX规定函数指针的大小与对象指针相同。 - Jonathan Leffler
1
可能有点晚了,但在那些不支持字节寻址的机器上,char * 通常比这些机器上的 int * 更大。这是因为你需要存储你正在寻址的单词的地址以及特定字符的偏移量,而对于整数,你只需要存储单词的地址。当然,我接触过的每台计算机都支持字节寻址... - CoffeeTableEspresso
显示剩余3条评论
3个回答

46

给定一个任意类型(我选择了char,但这只是为了举例):

char *p;

你可以使用以下任一表达式:

sizeof(p)
sizeof(char *)

导致像这样的malloc()调用:

char **ppc = malloc(sizeof(char *));
char **ppc = malloc(sizeof(p));
char **ppc = malloc(sizeof(*ppc));

最新版本的好处在于,如果 ppc 的类型改变,表达式仍会分配正确的空间。


5
首个表达式中括号是可选的。 - Carl Norum
3
@CarlNorum 说得没错,但我觉得它们能够使表达更加清晰明了。这是一种风格问题,不应该被编辑修改。 - Richard J. Ross III
33
在某些情况下,sizeof()函数的括号是可选的。在我进行了25多年的C编程后,我从未费力去记住括号何时是可选的,何时不是可选的。因为它们总是正确的,所以我拒绝学习何时可以省略它们。对我而言,保持一致性更有价值。 - Jonathan Leffler
9
@Kaz: 哪个是不必要的语法?记住用括号的sizeof(something)永远是正确的,比记住什么时候不需要括号容易得多。我认为省略括号是C编译器编写者必须处理的陷阱之一,普通程序员永远不应该担心它。 - Jonathan Leffler
2
我喜欢省略括号,以明确我正在评估lvalue的大小而不是类型。 - R.. GitHub STOP HELPING ICE
显示剩余5条评论

15

这应该就可以解决问题了:

sizeof(void*)

您能否给出一个短小的示例,使用C语言编写一个简单程序来演示它? - Bixo
2
@Bixo: int main() { return sizeof(void*); } - John Zwinck

2
char *ptr;
char **ptr2 = malloc(sizeof(ptr));

无论平台如何,这段代码都应该能够实现你的目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接