char[1] or char*

  1. 最近看一下php7源碼php

  2. 其中有個string的struct數組

struct _zend_string {
        zend_refcounted_h gc;
        zend_ulong        h;                /* hash value */
        size_t            len;
        char              val[1];
};

一直想不通爲何char數組並且是一個呢,爲何不是char*php7

而後我就作一個demo:ui

#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字節)空間問題呀指針

相關文章
相關標籤/搜索