我想将Zval转换为char *。我如何在我的php扩展程序中这样做?
答案 0 :(得分:12)
zval表示字符串,如果您有Z_STRVAL
/ Z_STRVAL_P
,则可以使用Z_STRVAL_PP
(或zval*
/ zval**
。
否则,您可能必须在之前转换zval:
zval *var;
char *cstr;
int cstrlen;
/* ... */
if (Z_TYPE_P(var) != IS_STRING) {
convert_to_string(var);
}
cstr = Z_STRVAL_P(var);
cstrlen = Z_STRLEN_P(var);
如果您不想更改原始zval并且想要更改生成的C字符串,则可以执行以下操作:
zval *var, *varcopy;
char *cstr;
int cstrlen;
if (Z_TYPE_P(var) != IS_STRING) {
ALLOC_INIT_ZVAL(varcopy);
*varcopy = *var;
INIT_PZVAL(varcopy); /* reset refcount and clear is_ref */
zval_copy_ctor(varcopy);
convert_to_string(varcopy);
} else {
varcopy = var;
}
cstrlen = Z_STRLEN_P(varcopy);
cstr = estrndup(Z_STRVAL_P(varcopy), cstrlen);
if (varcopy != var) {
zval_ptr_dtor(&varcopy);
}