char[1] or char*
2015-09-22 19:51
267 查看
摘要: char[1] or char*
最近看一下php7源码
其中有个string的struct
一直想不通为什么char数组而且是一个呢,为什么不是char*
然后我就做一个demo:
终于想明白啦,因为最后用的val,它只是一个指向而已,而且char[1]的占位1个字节,如果用char* 就是一个指针字节(32系统就是4字节,64位系统就是8字节)空间问题呀
最近看一下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字节)空间问题呀
相关文章推荐
- string,CString,char*之间的转化
- php中OR与|| AND与&&的区别总结
- bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory
- CodeIgniter错误mysql_connect(): No such file or directory解决方法
- python关键字and和or用法实例
- Python and、or以及and-or语法总结
- Python中AND、OR的一个使用小技巧
- Nginx中IF、AND、OR语句用法实例
- C++中char*与wchar_t*之间的转换
- and or not优先级
- 日常记录
- brackets编辑器在ie11下实现实时预览设置方法(版本需brackets 1.3以上)
- Lua实现C语言a ? b : c 的相关分析
- hibernate中criterion的常见用法
- Ruby on rails ActiveRecord ‘or’方式选择数据
- python and or用法
- poj 2533 Longest Ordered Subsequence dp
- 今天开始学Python(and 和 or 运算)
- UITextField输入框placeHolder内容前加空白 加控件
- Exercise 27: 熟记逻辑关系