码迷,mamicode.com
首页 > 其他好文 > 详细

char[1] or char*

时间:2015-09-22 19:14:58      阅读:188      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!