Php 将Zval转换为char*

Php 将Zval转换为char*,php,interpreter,php-extension,Php,Interpreter,Php Extension,我想把Zval转换成char*。如何在我的php扩展中做到这一点?如果zval表示字符串,您可以使用Z_STRVAL(或者Z_STRVAL\u p/Z_STRVAL\u PP如果您有zval*/zval**) 否则,您可能必须在以下情况之前转换zval: zval *var; char *cstr; int cstrlen; /* ... */ if (Z_TYPE_P(var) != IS_STRING) { convert_to_string(var); } cstr = Z_STR

我想把Zval转换成char*。如何在我的php扩展中做到这一点?

如果zval表示字符串,您可以使用
Z_STRVAL
(或者
Z_STRVAL\u p
/
Z_STRVAL\u 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);
}