最近看一下php7源碼php
其中有個string的struct數組
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
一直想不通爲何char數組並且是一個呢,爲何不是char*php7
而後我就作一個demo:ui
#include<stdio.h> #include<stdlib.h> #include<memory.h> struct _zend_string { char val[1]; }; typedef struct _zend_string zend_string; #define ZSTR_VAL(zstr) (zstr)->val #define offsetof __builtin_offsetof #define XtOffsetOf(s_type, field) offsetof(s_type, field) #define _ZSTR_HEADER_SIZE XtOffsetOf(zend_string, val) #define _ZSTR_STRUCT_SIZE(len) (_ZSTR_HEADER_SIZE + len + 1) zend_string *zend_string_alloc(size_t len) { zend_string *ret = (zend_string *)malloc(_ZSTR_STRUCT_SIZE(len)); return ret; } zend_string *zend_string_init(const char *str, size_t len){ zend_string *ret = zend_string_alloc(len); memcpy(ZSTR_VAL(ret), str, len); ZSTR_VAL(ret)[len] = '\0'; return ret; } int main(){ zend_string* zs = zend_string_init("asd", 3); printf("%s\n",ZSTR_VAL(zs)); return 0; }
終於想明白啦,由於最後用的val,它只是一個指向而已,並且char[1]的佔位1個字節,若是用char* 就是一個指針字節(32系統就是4字節,64位系統就是8字節)空間問題呀指針