char*p = NULL占用内存?

aka*_*ash 2 c memory heap pointers

我的问题是关于4GB可寻址系统的内存管理
char *p = NULL;
它是否占用任何内存?
如果是这样,堆或堆栈中的位置是多少?还说说char **p=NULL;

Mat*_*lia 8

在典型的32位系统上,它需要4个字节.

假设您的示例是某个函数中局部变量的定义,那么这些字节是从堆栈中获取的.虽然:

  • 如果变量未在别处使用,编译器可能会从生成的代码中完全删除它;
  • 如果变量仅在本地使用且未采用其地址,则可将其放入寄存器中,因此不占用"常规"存储器.

相反,如果它是一个全局变量(或者,通常是一个具有静态存储持续时间的变量),在大多数系统上都有一个特殊的内存区域(与堆栈分离,所谓的堆)用于它们.通常,它只是在写时复制模式下直接从可执行映像映射的内存区域.所以这里4个字节都被占用在这个特定的内存区域,都在可执行文件的空间中.

这同样适用char **p,根据原则,没有理由以某种方式更大或不同char *.


顺便说一下,如果char * p或者char ** p是聚合数据类型(通常是a struct)的一部分,它们占用的空间来自struct分配的任何地方- 如果struct变量是局部变量,它来自堆栈,如果它是动态分配malloc的堆,如果它是全局的,它来自全局变量的特殊内存区域.请记住,在讨论structs所占用的空间时,有关填充的其他注意事项会发挥作用.


请注意,所有这些都是对"典型"32位系统有效的考虑因素; 没有什么可以阻止一些奇怪的架构从char **大小不同char *(虽然我没有看到任何理由这样做).您仍然可以使用sizeof操作员执行直接检查.

就标准而言,我认为对指针大小施加的唯一约束是任何指向数据的指针都可以在void *不丢失信息的情况下进行转换(实际上,标准从未提及过堆栈或寄存器).另外,请记住,只要"可观察行为"与标准请求的内容一致,编译器就可以执行任何需要的操作,因此对标准规定的这些实现细节没有实际保证,尽管更多细节可以在您正在使用的编译器的文档中找到.