首页 文章

C - 分配内存,它是如何存储的?

提问于
浏览
1

在我看过的K&R电子书中,我遇到了这段代码:

code

我关心的是:

allocbuf + ALLOCSIZE - allocp >= n

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

现在,据我所知,如果你要定义一个字符指针,那么就算是将算术递增一个:

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

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


因此,假设数组在指针的幌子下运行:

allocbuf + 10000

是数组中最后分配的插槽,对吗?由于指针的类型为char,因此稍后10000个“槽”实际上是10,000 * sizeof(char)槽 .

为了在我的脑海中澄清这个概念,给定一个随机存储器地址4210720,4210721是否表示通过该地址的位,字节或其他某些元素?

那是:

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

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

从本质上讲,使用什么度量标准存储?比特字节,半字节等?

3 回答

  • 1

    内存地址是每台计算机上的字节地址,您必须具有字节级内存操作 . 有些编译器定义将 void * 递增为向指针添加一个,但它不可移植 .

  • 1

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

    ptr+1 = next address of ptr type.
    
  • 2

    allocbuf 10000是数组中最后分配的插槽,对吗?

    这是一个结束 .

    为了在我的脑海中澄清这个概念,给定一个随机存储器地址4210720,4210721是否表示通过地址的位,字节或其他某些元素?

    一个字节(3.6):

    “可寻址的数据存储单元,其大小足以容纳执行环境的基本字符集的任何成员 . 注1:可以唯一地表示对象的每个字节的地址 . ”

    最后,

    void * ptr =“sherrellbc”; \ n ptr; - 现在ptr在哪里?

    void* 上的算术是非法的 . 唐't use it ;) It'就像要求编译器获取变量所持有的地址并向其添加 sizeof(void) .

    如果必须归结为此,请改用 char* .

相关问题