嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2016-03-09 1419 次浏览 标签 : C

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

#include <stdio.h>
#include <stdlib.h>

typedef unsigned int       uint;
 
typedef struct _zend_ini_entry {
    char *name;
    uint name_length;
    char *value;
    uint value_length;
} zend_ini_entry;
 
static const zend_ini_entry ini_entries[] = {
    {"mysql.host",sizeof("mysql.host"),"127.0.0.1",sizeof("127.0.0.1")},
    {"mysql.port",sizeof("mysql.port"),"3306",sizeof("3306")},
};
 
int zend_register_ini_entries(const zend_ini_entry *ini_entry) {
    for (int i = 0; i < 2; ++i) {
        printf("%s = %s\n", ini_entry[i].name, ini_entry[i].value);
    }
}
 
int main(int argc, const char * argv[]) {
    zend_register_ini_entries(ini_entries);
    return 0;
}

不使用数组时

static const zend_ini_entry ini_entry = {ZEND_INI_ALL,"mysql.host",sizeof("mysql.host"),"127.0.0.1",sizeof("127.0.0.1")};

int zend_register_ini_entries(const zend_ini_entry *ini_entry) {
	printf("%s = %s\n", ini_entry->name, ini_entry->value);
}

int main(int argc, const char * argv[]) {
	zend_register_ini_entries(&ini_entry);
    return 0;
}

也就是说,仅仅通过一个函数的定义

int zend_register_ini_entries(const zend_ini_entry *ini_entry);

不能确定传入的是单个ini_entry还是ini_entry数组。能确定的仅仅是一个指针。


由于数组的名称表示数组的地址,也是第一个元素的地址。所以,当传入的是数组的时候,除了使用上面用到的“使用结构体通过.取成员”

int zend_register_ini_entries(const zend_ini_entry *ini_entry) {
    for (int i = 0; i < 2; ++i) {
        printf("%s = %s\n", ini_entry[i].name, ini_entry[i].value);
    }
}

还可以使用“结构体指针通过->的方式来获取值。

    while(ini_entry->name){
    	printf("%s = %s\n", ini_entry->name, ini_entry->value);
    	ini_entry++;
    }

但是这样会出现数组越界的问题。所以我看到 PHP 源码里会这样用

static const zend_ini_entry ini_entries[] = {
    {"mysql.host",sizeof("mysql.host"),"127.0.0.1",sizeof("127.0.0.1")},
    {"mysql.port",sizeof("mysql.port"),"3306",sizeof("3306")},
    {NULL,0,NULL,0},
};

这样,就不会越界了。

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表