1

在我一直在阅读的一本 K&R 电子书中,我遇到了以下代码:

代码

我担心的是:

allocbuf + ALLOCSIZE - allocp >= n

代码获取缓冲区开始的地址,并使用指向自身的指针的索引以及上面定义的最大缓冲区长度常量计算剩余分配总数。

现在,我了解到,如果您要定义一个字符指针,例如,然后以算术方式将其加一:

char *ptr = "array";
ptr++;

然后你会得到第二个位置,上面的'r',在内存中。在内存中,实际上以 sizeof(char) 为单位递增。


因此,鉴于数组以指针的名义运行:

allocbuf + 10000 

数组中最终分配的插槽是否正确?由于指针是 char 类型的,所以 10000 'slots' 之后实际上是 10,000*sizeof(char) 之后的插槽。

为了在我的脑海中澄清这个概念,给定一个随机内存地址,比如 4210720,4210721 是否代表该地址之后的位、字节或其他一些指标?

那是:

void *ptr = "sherrellbc";
ptr++;

ptr 现在在哪里?它是否位于 's' 和 'h' 之间的某个指针处,因为 void 类型没有提供有关步长的信息(例如,char 指针将按 sizeof(char) 递增)。

本质上,内存使用什么指标存储?位字节,半字节等?

4

3 回答 3

2

内存地址是您可能使用的每台计算机上的字节地址,即使是那些没有字节级内存操作的计算机。一些编译器将递增 a 定义void *为向指针加一,但它不可移植。

于 2013-07-13T20:06:50.420 回答
1

取消引用 void 指针本质上是未定义的。如果定义了类型,则增量将始终

ptr+1 = next address of ptr type.
于 2013-07-13T20:07:13.820 回答
1

allocbuf + 10000数组中最终分配的插槽是否正确?

这是一个过去的结束。

为了在我的脑海中澄清这个概念,给定一个随机内存地址,比如 4210720,4210721 是否代表该地址之后的位、字节或其他一些指标?

一个字节(3.6):

“可寻址的数据存储单元,大到足以容纳执行环境的基本字符集的任何成员。

注 1 可以唯一地表示对象的每个单独字节的地址。”

最后,

void *ptr = "sherrellbc"; \n ptr++;- ptr 现在在哪里?

算术void*是非法的。不要使用它;)这就像要求编译器获取变量所持有的地址并添加sizeof(void)到它。

如果必须归结为这一点,请char*改用。

于 2013-07-13T20:15:52.123 回答