php扩展ZVAL_STRING疑惑

发布于 2022-09-05 19:52:13 字数 526 浏览 29 评论 0

编译通过

zval tmp;
ZVAL_STRING(&tmp, "hello");

编译失败

zval *tmp;
ZVAL_STRING(tmp, "hello")

最后调用的是这个宏,这里不是有

zval *__z = (z) 说明z传一个指针进来不就好了吗,为啥上面两种会有区别

#define ZVAL_NEW_STR(z, s) do {                    \
        zval *__z = (z);                        \
        zend_string *__s = (s);                    \
        Z_STR_P(__z) = __s;                        \
        Z_TYPE_INFO_P(__z) = IS_STRING_EX;        \
    } while (0)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜心 2022-09-12 19:52:13

php7跟php5 这两个函数是有差别的 确认下环境,另外,指针没有初始化就被使用了,语言层面的问题,感觉跟php没有多大关系了

雪花飘飘的天空 2022-09-12 19:52:13

zval *tmp 这是个野指针,指向未知内存。你直接用它,当然会出错。
zval tmp 是个是在栈上分配了内存的,&tmp 当然会指向分配的那块内存。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文