在典型的32位系统上,它需要4个字节.
假设您的示例是某个函数中局部变量的定义,那么这些字节是从堆栈中获取的.虽然:
相反,如果它是一个全局变量(或者,通常是一个具有静态存储持续时间的变量),在大多数系统上都有一个特殊的内存区域(与堆栈分离,所谓的堆)用于它们.通常,它只是在写时复制模式下直接从可执行映像映射的内存区域.所以这里4个字节都被占用在这个特定的内存区域,都在可执行文件的空间中.
这同样适用char **p
,根据原则,没有理由以某种方式更大或不同char *
.
顺便说一下,如果char * p
或者char ** p
是聚合数据类型(通常是a struct
)的一部分,它们占用的空间来自struct
分配的任何地方- 如果struct
变量是局部变量,它来自堆栈,如果它是动态分配malloc
的堆,如果它是全局的,它来自全局变量的特殊内存区域.请记住,在讨论struct
s所占用的空间时,有关填充的其他注意事项会发挥作用.
请注意,所有这些都是对"典型"32位系统有效的考虑因素; 没有什么可以阻止一些奇怪的架构从char **
大小不同char *
(虽然我没有看到任何理由这样做).您仍然可以使用sizeof
操作员执行直接检查.
就标准而言,我认为对指针大小施加的唯一约束是任何指向数据的指针都可以在void *
不丢失信息的情况下进行转换(实际上,标准从未提及过堆栈或寄存器).另外,请记住,只要"可观察行为"与标准请求的内容一致,编译器就可以执行任何需要的操作,因此对标准规定的这些实现细节没有实际保证,尽管更多细节可以在您正在使用的编译器的文档中找到.
归档时间: |
|
查看次数: |
1960 次 |
最近记录: |