将指针存储在内存中,比它所指向的字节占用更多的内存吗?

4
我的问题是指针的值存储在哪里,它们在内存中占用的空间是否比它们所指向的内容更多。例如,如果我有一个64位指针,用于指向内存中的一字节信息,指针的值存储在哪里,它是否比数据本身占用更多的空间?
以下是使用C语言编写的问题示例:
char data = 10;
char* charPointer = &data;
charPointer是否比数据本身占用更多的空间,因为指针是64位而数据只有8位?
PS:我目前正在尝试学习C语言的基础知识。

请勿同时标记C和C++,除非涉及两种语言之间的差异或交互问题。如果要针对这两种语言提出相同的问题,请为每种语言发布一个问题。 - Eric Postpischil
sizeof 运算符给出与某个东西使用的内存相关的结果。通常情况下,sizeof(char *) 是实现定义的,但在实践中通常大于 1(例如,在 32 位系统上通常为 4,在 64 位系统上通常为 8)。根据定义,sizeof(char) 等于 1。很容易推断出(例如)4 > 18 > 1。问题在于 - 根据对其的处理方式 - 编译器可能会将 charPointer 优化掉,因此在运行时不使用任何内存。 - Peter
2个回答

5

指针的值存储在您声明它要存储的地方;例如,如果您将指针声明为局部变量,则它将存储在堆栈中;另一方面,如果您在堆上分配了指针(或更常见的是,将指针作为在堆上分配的对象的成员变量包含在内),则指针将在堆中。

那么指针本身占用的空间是否比数据本身多?

在这种情况下,是的。

您实际上可以检查一个值占用多少空间:

printf("data takes up %zu bytes\n", sizeof(data));
printf("charPointer takes up %zu bytes\n", sizeof(charPointer));

如果你使用的是64位计算机,你会发现指针占用8字节,这与你所期望的相同。

指针指向的char类型占用1个字节,但在许多情况下,也会插入一些填充字节,以保持堆栈中下一个变量的对齐方式,以便CPU能够高效地访问。


3

在几乎所有的C实现中,指向char的指针比char本身占用更多的空间。(C标准允许它们大小相同,但这样的实现在最好的情况下很少见,更有可能是过时或不存在的。)

尽管如此:

  • 人们可能需要一个指针来指向一组对象中的某个对象,或者管理对象,或者以各种方式将它们连接起来。
  • 指针可以指向比char大得多的对象。
  • 指针可以指向数组中的许多元素中的第一个元素,因此一个指针可以提供对许多对象的访问。

虽然不常见,但在某些系统上,char 的大小可能大于8位(例如UTF-16)。虽然在实践中指针很少会小于8位,但选择的本机char类型足够大以与指针相同大小是有可能的。 - Peter

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