+ -
当前位置:首页 → 问答吧 → 关于RETURN_STRING的疑惑

关于RETURN_STRING的疑惑

时间:2011-06-21

来源:互联网

昨天写拓展的时候

#define  VERSION "1.10"

RETURN_STRING(VESION,0)  在cli下程序运行有问题。
而RETURN_STRING(VESION,1)  才正常

我看了一下源码  



  1. #define ZVAL_STRING(z, s, duplicate) {        \                const char *__s=(s);                        \                Z_STRLEN_P(z) = strlen(__s);        \                Z_STRVAL_P(z) = (duplicate?estrndup(__s, Z_STRLEN_P(z)):(char*)__s);\                Z_TYPE_P(z) = IS_STRING;                \        }
复制代码



我就是不明白了,为什么用了estrndup后才正常呢?

作者: wida   发布时间: 2011-06-21

刚看了一下

  1. typedef union _zvalue_value {        long lval;                                        /* long value */        double dval;                                /* double value */        struct {                char *val;                int len;        } str;        HashTable *ht;                                /* hash table value */        zend_object_value obj;} zvalue_value;
复制代码



是不是php内核string 不是用 '\0'表示的结束的,而是每一个都要给len来读的??

作者: wida   发布时间: 2011-06-21

你打错字了大哥,

#define  VERSION "1.10"

RETURN_STRING(VESION,0)

作者: liexusong   发布时间: 2011-06-21

刚看了一下




是不是php内核string 不是用 '\0'表示的结束的,而是每一个都要给len来读的?? ...
wida 发表于 2011-6-21 23:08



    不是php什么内核,是c语言的字符串本来就是以'\0'结束的。

作者: bs   发布时间: 2011-06-22

常量不能返回引用。

回复 4# bs


    c “字符串” 并没有规定必须要 \0 结束,PHP是使用len控制的。
不信你可以在PHP的字符串里加上 \0 ,比如 "test\0end",然后输出,你看它是否输出 \0 后的字符。

http://zoeey.zin.cn/2010/10/22/c-language-char-malloc-calloc-memory/

以前写的,域名挂了-_-#

作者: 绿霸花季护航   发布时间: 2011-06-22

常量不能返回引用。

回复  bs


    c “字符串” 并没有规定必须要 \0 结束,PHP是使用len控制的。
不信 ...
绿霸花季护航 发表于 2011-6-22 09:53



    C标准是没有规定用\0作为结束,不过一般都是这样做的。
PHP的字符串是二进制安全的,就是不以\0作为结束。不过我觉得最好也不要有\0。

作者: liexusong   发布时间: 2011-06-22

试了下,RETURN_STRING第二个参数还真是要用1才行。

作者: wangweiak   发布时间: 2012-09-02

{:soso__4011813854091704040_4:} 嗯嗯

作者: 爱闪播   发布时间: 2012-09-04

不是,这个是因为你#define VERSION的时候,只是在RETURN_STRING的时候做简单的替换,
那么就相当于这个字符串是分配在栈上的,也就是函数生命期结束的时候会被删除的,
所以需要设置duplicate参数为非零,
重新在堆上开辟空间,写入字符串,传回去,这样在函数外访问的时候,才不会出错不会被清理掉,
我是这么理解的

作者: kylidboy   发布时间: 2012-11-17

RETURN_STRING(VERSION,1)
后面的1是要拷贝一份,不拷贝的话分配在栈上面的内容就清掉了,返回的东西自然也就没了

作者: hmly   发布时间: 2012-11-21

观望中

作者: 洋柿子   发布时间: 2012-11-26