- 最近看一下php7源码
- 其中有个string的struct
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
一直想不通为什么char数组而且是一个呢,为什么不是char*
然后我就做一个demo:
#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字节)空间问题呀
时间: 2024-10-10 04:39:56