您的位置:首页 > 其它

char[1] or char*

2015-09-22 19:51 267 查看
摘要: char[1] or char*

最近看一下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字节)空间问题呀
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  char[1] or char*