#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}, };
这样,就不会越界了。