为什么80%的码农都做不了架构师?>>>
array_init 和array_init_size 这2个看起来像是个函数其实这2个都是宏,具体定义在文件:zend_API.h 中。
#define array_init(arg) _array_init((arg), 0 ZEND_FILE_LINE_CC)
#define array_init_size(arg, size) _array_init((arg), (size) ZEND_FILE_LINE_CC)
_array_init函数定义在zend_API.c文件中。
/* Argument parsing API -- andrei */
ZEND_API int _array_init(zval *arg, uint size ZEND_FILE_LINE_DC) /* {{{ */
{
ALLOC_HASHTABLE_REL(Z_ARRVAL_P(arg));
_zend_hash_init(Z_ARRVAL_P(arg), size, NULL, ZVAL_PTR_DTOR, 0 ZEND_FILE_LINE_RELAY_CC);
Z_TYPE_P(arg) = IS_ARRAY;
return SUCCESS;
}
通过对_array_init函数的分析,可以看到传递给_array_init的arg参数必须是已经初始化了的zval,否则会报段错误。所以array_init和array_init_size的正确用法是:
zval *arr1, *arr2;
MAKE_STD_VAL(arr1);
MAKE_STD_VAL(arr2);
array_init(arr1);
array_init(arr2, 31);