免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6274 | 回复: 1
打印 上一主题 下一主题

用c写php的扩展,遇到奇怪的问题,麻烦大家指点一下啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-30 14:13 |只看该作者 |倒序浏览
  1. PHP_FUNCTION(list_clean)
  2. {
  3.     zval *z_array; /* 外部传入的数组 */
  4.     zval **z_item; /* 一级数组单元 */
  5.     zval **zz_item; /* 二级数组单元 */
  6.    
  7.     int len, len1;
  8.     int i, i1;
  9.     int tag = 0;
  10.     if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &z_array)) {
  11.         return;
  12.     }
  13.    
  14.     array_init(return_value);
  15.     /* 获取数组大小 */
  16.     len = zend_hash_num_elements(Z_ARRVAL_P(z_array));
  17.     /* 将数组的内部指针指向第一个单元 */
  18.     zend_hash_internal_pointer_reset(Z_ARRVAL_P(z_array));
  19.     for (i = 0; i < len; i ++) {
  20.         char* key;
  21.         int idx;
  22.         /* 获取当前数据 */
  23.         zend_hash_get_current_data(Z_ARRVAL_P(z_array), (void**) &z_item);
  24.         convert_to_array_ex(z_item);

  25.         if (zend_hash_get_current_key(Z_ARRVAL_P(z_array), &key, &idx, 0) == HASH_KEY_IS_STRING) {
  26.             /* KEY为字符串 */
  27.             return;
  28.         } else {
  29.             int breakTag = 0;
  30.             /* KEY为数字 */
  31.             zval *temp_value;
  32.             MAKE_STD_ZVAL(temp_value);
  33.             array_init(temp_value); /* 存储组成return_value的中间数组 */
  34.             len1 = zend_hash_num_elements(Z_ARRVAL_P(*z_item));
  35.             zend_hash_internal_pointer_reset(Z_ARRVAL_P(*z_item));

  36.             for(i1=0; i1<len1; i1++){
  37.                 char* key1;
  38.                 int idx1;
  39.                 /* 获取当前数据 */
  40.                 zend_hash_get_current_data(Z_ARRVAL_P(*z_item), (void**) &zz_item);
  41.                 convert_to_string_ex(zz_item);

  42.                 if (zend_hash_get_current_key(Z_ARRVAL_P(*z_item), &key1, &idx1, 0) == HASH_KEY_IS_STRING){
  43.                      add_assoc_string(return_value, key1, Z_STRVAL_PP(zz_item), 1);
  44.                     //add_next_index_string(return_value, Z_STRVAL_PP(zz_item), 1);
  45.                     // add_next_index_string(return_value, key1, 1);
  46.                 }else{
  47.                     return;
  48.                 }
  49.                 zend_hash_move_forward(Z_ARRVAL_P(*z_item));
  50.             }
  51.             //add_index_zval(return_value, tag, temp_value);
  52.             tag++;
  53.             zval_ptr_dtor(&temp_value); /* 释放资源 */
  54.         }
  55.         /* 将数组中的内部指针向前移动一位 */
  56.         zend_hash_move_forward(Z_ARRVAL_P(z_array));
  57.     }
  58. }
复制代码
用c定义了个叫list_clean的php函数,在php中写的测试代码如图:


当我注释掉46、48行,保留47行代码时,
测试结果如图:

说明Z_STRVAL_PP(zz_item)值是没问题的

当我注释掉46、47行,保留48行时,
测试结果如图:

说明索引key1也是没问题的

但当我保留46行,注释掉47、48行时
测试结果如图:

这时的结果就出问题了

有哪位大神能指点迷津卜/

论坛徽章:
0
2 [报告]
发表于 2013-10-30 17:18 |只看该作者
I see,  zval_ptr_dtor(&temp_value);用错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP