char * p = NULL占用内存?

时间:2012-08-14 13:33:26

标签: c memory pointers heap

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

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


顺便说一下,如果char * pchar ** p是汇总数据类型的一部分(通常为struct),则他们占用的空间来自struct所在的位置已分配 - 如果struct变量是一个局部变量,它来自堆栈,如果它是在堆上动态分配malloc,如果它是全局的,它来自全局变量的特殊内存区域。请记住,在讨论struct s所占用的空间时,有关填充的其他注意事项会发挥作用。


请注意,所有这些都是对“典型”32位系统有效的考虑因素;没有什么可以阻止一些奇怪的架构使char **的大小与char *不同(尽管我认为没有任何理由这样做)。您仍然可以使用sizeof运算符执行直接检查。

就标准而言,我认为对指针大小施加的唯一约束是任何指向数据的指针都可以在void *之间转换而不会丢失信息(实际上,标准不会永远提到堆栈或寄存器)。另外,请记住,只要“可观察行为”与标准所要求的内容一致,编译器就可以做任何想做的事情,因此对标准规定的这些实现细节没有实际保证,尽管更多细节可以在您正在使用的编译器的文档中找到。

答案 1 :(得分:1)

如果没有上下文,变量p的两个版本通常会分别占用一个char*和一个char**的内存,这可能是自动(“堆栈”)或静态(“全球“)存储。所需的大小不大于void*的大小(通常是一个机器字)。

总是允许编译器表现为“好像”这个变量存储在内存中,但如果它可以直接替换它的值,它可以完全删除变量。从这个意义上说,没有绝对的保证,你的C结构将导致任何特定的具体机器代码。

答案 2 :(得分:0)

指针只是一个可以容纳地址的普通变量。无论在哪里创建char *变量,它都将使用内存,无论变量的值是多少。在32位系统上,指针的典型大小为32位,而在64位机器上则为64位。与intlong一样。