首页 > 解决方案 > 用于不寻常架构的 C 指针算法

问题描述

我试图更好地理解 C 标准。特别是我对指针算法如何在不寻常的机器架构的实现中工作感兴趣。

假设我有一个带有 64 位宽寄存器的处理器,它连接到 RAM,其中每个地址对应一个 4 位宽的单元。这台机器的 C 实现将 CHAR_BIT 定义为等于 8。假设我编译并执行以下代码行:

char *pointer = 0;
pointer = pointer + 1;

执行后,指针等于 1。这给人的印象是,通常 char 类型的数据对应于机器上最小的可寻址内存单元。

现在假设我有一个带有 12 位宽寄存器的处理器,它连接到 RAM,其中每个地址对应一个 4 位宽的单元。这台机器的 C 实现将 CHAR_BIT 定义为等于 12。假设为这台机器编译和执行相同的代码行。指针是否等于 3?

更一般地,当您增加指向 char 的指针时,地址是否等于 CHAR_BIT 除以机器上存储单元的宽度?

标签: cpointerslanguage-lawyerpointer-arithmetic

解决方案


指针是否等于 3?

好吧,标准并没有说明指针是如何实现的。该标准告诉您以特定方式使用指针时会发生什么,而不是指针的值应该是什么。

我们所知道的是,将 1 加到 char 指针上,将使指针指向下一个 char 对象——无论它在哪里。但没有关于指针值的内容。

所以当你这么说

pointer = pointer + 1;

会使指针等于1,这是错误的。该标准对此没有任何说明。

在大多数系统上,achar是 8 位,指针是(虚拟)内存地址,引用 8 位可寻址内存位置。在这样的系统上,增加一个 char 指针会将指针值(也就是内存地址)增加 1。但是,在不寻常的体系结构上,没有办法说出来。

++pointer但是,如果您有一个系统,其中每个内存地址引用 4 位而 char 是 12 位,那么将指针增加 3似乎是一个不错的猜测。


推荐阅读