关于RETURN_STRING的疑惑
时间:2011-06-21
来源:互联网
#define VERSION "1.10"
RETURN_STRING(VESION,0) 在cli下程序运行有问题。
而RETURN_STRING(VESION,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
- 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
作者: wangweiak 发布时间: 2012-09-02
作者: 爱闪播 发布时间: 2012-09-04
那么就相当于这个字符串是分配在栈上的,也就是函数生命期结束的时候会被删除的,
所以需要设置duplicate参数为非零,
重新在堆上开辟空间,写入字符串,传回去,这样在函数外访问的时候,才不会出错不会被清理掉,
我是这么理解的
作者: kylidboy 发布时间: 2012-11-17
后面的1是要拷贝一份,不拷贝的话分配在栈上面的内容就清掉了,返回的东西自然也就没了
作者: hmly 发布时间: 2012-11-21
作者: 洋柿子 发布时间: 2012-11-26
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28