最近看一下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字节)空间问题呀指针