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