baiyansegmentfault
所有视频:https://segmentfault.com/a/11...数组
源视频地址:http://replay.xesv5.com/ll/24...安全
struct string{ ... int len; //存长度(至于为何存长度下文会讲到) char* val; //存真正的字符串值 };
那么咱们发现,这样作有以下缺点:数据结构
int main() { struct string{ int len; }; typedef struct string str; char *s = "he"; str *p = (str*)(malloc(sizeof(str) + strlen(s) + 1)); //分配足够存下一个字符串的结构体 p->len = strlen(s); memcpy(p + 1, s, strlen(s)); //将字符串拷贝到紧邻结构体的内存处 }
struct _zend_string { zend_refcounted_h gc; /*引用计数,与垃圾回收相关,暂不展开*/ zend_ulong h; /* 冗余的hash值,计算数组key的哈希值时避免重复计算*/ size_t len; /* 长度 */ char val[1]; /* 柔性数组,真正存放字符串值 */ };
第一个问题:为何要存长度len?不存长度,直接和C语言同样经过字符串的'\0'来判断字符串结束不行吗?不行。这里有一个二进制安全的问题。spa