# C 数据类型
基本的数据类型有int、double、long、char及各种指针类型。在C语言中,使用变量时,提前定义变量并指定变量类型,而在PHP中变量不需要指定类型。
C语言的数据类型在不同的操作系统中长度不同。
# 结构体(struct)
使用 struct 定义就是结构体。zval结构体总大小 16 字节。
```
struct _zval_struct {
zend_value value; /* value 8个字节 */
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* 代表不同类型 */
zend_uchar type_flags, /* 表示常量或不可变类型 变量标记 */
zend_uchar const_flags, /* 常量类型标记 */
zend_uchar reserved) /* 保留字段 */
} v;
uint32_t type_info;
} u1; /* u1 4个字节 */
union {
uint32_t next; /* 解决hash冲突的 */
uint32_t cache_slot; /* 运行时缓存 */
uint32_t lineno; /* AST抽象语法树 标记php行 */
uint32_t num_args; /* 函数传入参数的个数 */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
uint32_t access_flags; /* class constant access flags 类标记 public等 */
uint32_t property_guard; /* single property guard 防止类循环引用 */
} u2; /* u2 4个字节 */
};
```
# 联合体(union)
联合体复用同一块内存,联合体大小为最大成员的大小。
```
union test{
char a; //1
int b; // 4
long c; //8
}
```
联合体是成员变量共享一块内存,可以根据使用确定含义;而结构体是不共享的,成员变量不共享一块内存。另外,结构体存在对齐问题。
# 堆和栈的基本知识
1. 栈区(stack)——存储参数值、局部变量,维护函数调用关系等。
2. 堆区(heap)——动态内存区域,随时申请和释放,程序自身要对内存泄漏负责。
3. 全局区(静态区)——存储全局和静态变量。
4. 字面量区——常量字符串存储区。
5. 程序代码区——存储二进制代码。
总体来讲,栈上的变量是局部的,随着局部空间的销毁而销毁,由系统负责。
堆上的变量可以提供全局访问,需要自行处理其生命周期。
