【问题标题】:C pointer data structure in memory [closed]内存中的C指针数据结构[关闭]
【发布时间】:2019-08-23 21:24:14
【问题描述】:

我想看看实际的指针变量在内存中包含什么。我知道它包含一个地址。但它还包含什么?

C 编程语言中,Brian W. Kernighan 和 Dennis M. Ritchie 在第 93 页上说指针是 2 或 4 个字节。此页面上有一个有用的图形。

图形和数据定义会有所帮助。

【问题讨论】:

  • 它依赖于实现,但在大多数传统计算机上它只是一个地址。
  • 在大多数系统上它只是一个(无符号)整数
  • 那本书有些过时了。在现代系统上,它是 4 或 8 个字节。
  • @JoshGinn,该整数为 4 或 8 个字节宽。换句话说,需要 4 或 8 个字节来保存计算机可以使用的任何可能的地址
  • 有谁知道这对于指向堆内存的指针是否相同?我认为malloc()calloc() 操作的大小存储在某处,因此free() 知道要回收多少内存。

标签: c pointers memory-management


【解决方案1】:

如果处理器使用“平面”、字节寻址的内存寻址方案,其中地址空间被建模为 N 字节的内存,分别编号从 0 到 N-1,然后在通常情况下,指针值只是指针指向的单个内存字节的数字或“地址”。

如果您将内存视为unsigned char 的一个大数组,那么指针实际上就是该数组的索引。 (通常,当我们比较和对比数组和指针时,我们认为数组索引和指针是两个非常不同的东西,但它们实际上非常密切相关,不仅在计算机编程中,而且在英语中,正如你将如果您考虑一下您用来指向事物的手指的名称,请意识到。)

我以一个很大的if 开始这个答案,因为这一切都不能保证。如果您对可移植编程感兴趣,这不是您应该依赖的那种东西。有些机器具有字寻址而不是字节寻址的内存空间,或者使用“平面”方案以外的东西。但是这些大部分都已经消失了,无论好坏,今天绝大多数程序员只会遇到扁平的字节寻址的。

话虽如此,但也有一些使用“智能”指针的实现,这些指针是更大、更高级的数据结构,可以携带(例如)边界信息。 C指针模型绝对不排除这些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2017-09-01
    • 2015-06-12
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多