gpt4 book ai didi

char *p =NULL 占用内存?

转载 作者:行者123 更新时间:2023-12-02 06:38:56 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

char **p 也是如此,从原则上讲,它没有理由比 char * 更大或不同。


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


请注意,所有这些都是适用于“典型”32 位系统的注意事项;没有什么能阻止一些奇怪的架构使 char ** 的大小与 char * 不同(尽管我看不出有任何理由这样做)。不过,您可以使用 sizeof 运算符执行直接检查。

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

关于char *p =NULL 占用内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11953428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com