首页 > 其他 > 详细

char[1] or char*

时间:2015-09-22 19:13:49      阅读:407      评论:0      收藏:0      [点我收藏+]
  1. 最近看一下php7源码

  2. 其中有个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*

原文:http://my.oschina.net/u/242853/blog/509720

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!