开发者社区> 问答> 正文

php的RETURN_STRINGL使用静态字符串报错,什么原因?

我的c基础不是很好,还请知道的能详解一下,谢谢
如果我直接使用类似如下的代码,就会出segfault错误

char* ret = "hello world";
RETURN_STRINGL(ret, strlen(ret), 0);

无论ret是直接写字符串,还是先初始化成char[100]这样,都不行
但是只要将程序稍加改进使用动态分配内存就没事:

char* hello = "hello world";
int   len = strlen(hello);
char* ret = (char*)emalloc(len);
memcpy(ret, hello, len);
RETURN_STRINGL(ret, len, 0);

补充一句:后来发现RETURN_STRINGL的第三个参数改成1也不会有越界访问错误了

展开
收起
落地花开啦 2016-06-12 14:09:42 2753 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    这个问题的实质是:
    php本身是类型安全的脚本语言,对于RETURN_STRINGL或是RETURN_STRING返回的字符串,php会在适当的时候free掉,所以程序员要保证返回的字符串在堆里,能够free掉,这就是为什么动态分配就没事的原因。而:

    char* ret = "hello world";
    RETURN_STRINGL(ret, strlen(ret), 0);

    这是直接返回了一个静态字符串,导致php在free这个字符串的时候出错。
    RETURN_STRINGL和RETURN_STRING最后一个参数,如果是1,表示对第一个参数中的字符串在堆里复制一份返回。这就是为什么最后一个参数等于1的时候,程序正常的原因。

    2019-07-17 19:33:58
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载