免费注册 查看新帖 |

Chinaunix

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

知道一个字符串ARRAY(0x9608708),能否得到它指定的地址的值呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-27 18:40 |只看该作者 |倒序浏览
20可用积分
如果用XS,如何将这个地址传到C函数里面呢?

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
2 [报告]
发表于 2010-05-27 20:55 |只看该作者
唉  下午看那个数组引用的帖子时,也想到了这个问题,当时还想用eval看下。。。

关注

论坛徽章:
0
3 [报告]
发表于 2010-05-27 21:00 |只看该作者
关注之。。
这个我做不到滴。

论坛徽章:
0
4 [报告]
发表于 2010-05-28 07:58 |只看该作者
xs里面有标准的做法。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-05-28 08:25 |只看该作者
回复 1# toniz


我想先问个问题,ARRAY(0x960870,这是个地址吗?(我觉得是)如果是,那这个地址里是一个数组的引用。
如果你说知道这个地址,想看地址里的值,那就Dumper一下就能看到。
  1. my @array = (1,2,3);
  2. my $ref = \@array;
  3. print $ref;
  4. print Dumper($ref);
复制代码
如果你想指定一块内存地址,而你确信知道这块地址里存的是一个数组的引用。
那在XS里可以用SvRV宏dereference,然后再转成AV*(数组指针)然后用av_fetch拿数组的值。
  1. avref = (AV*)SvRV(svp);
复制代码
其中svp就是地址,这里说的地址假设是IV类型。

但我觉得这个需求很奇怪,如果你都知道一个变量是数组的引用了,那就直接Dumper就可以看到这个变量的值了。像你说的,你知道“字符串ARRAY(0x960870”,我觉得就挺奇怪的,你是怎么知道的这个字符串?还是应该有对应的变量吧。

论坛徽章:
0
6 [报告]
发表于 2010-05-28 15:52 |只看该作者
本帖最后由 toniz 于 2010-05-28 16:01 编辑
回复  toniz


我想先问个问题,ARRAY(0x960870,这是个地址吗?(我觉得是)如果是,那这个地址里是 ...
py 发表于 2010-05-28 08:25



    呵呵  先谢谢PY和各位同学先。


其实是这样的  昨天看到一帖子  有个代码如下:
  1. @s=qw(1 1 1 1 1 1 1);
  2. $a=\@s;
  3. $b="$a";#引号将reference字符串化了,失去了引用的功能
  4. print $a,"\n";
  5. print $b,"\n";#虽然print的结果和$a一样,但没有引用功能。
  6. print @{$a},"\n";
  7. print @{$b},"\n";#结果为空。
复制代码
因为加了个双引号,这个时候,其实$b的引用被字符化了。这时候我就在想,能不能$b这个字符串,得到对应的这个地址内容呢。

论坛徽章:
0
7 [报告]
发表于 2010-05-28 16:06 |只看该作者
本帖最后由 climby 于 2010-05-28 16:11 编辑

回复 6# toniz


    我尝试了一下,代码如下:

  1. #!/usr/bin/perl

  2. use Data::Dumper;

  3. my @var = ( 'a', 'b', 'c' );

  4. my $str = Dumper( \@var );

  5. print "reference to str:\n$str\n";

  6. my $str2ref = eval($str);

  7. print "string to reference:\n@{$str2ref}\n";

复制代码
运行结果:

  1. reference to str:
  2. $VAR1 = [
  3.           'a',
  4.           'b',
  5.           'c'
  6.         ];

  7. string to reference:
  8. a b c
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-05-28 16:13 |只看该作者
ARRAY(0x960870
后面的数字 是什么 那里有官方解释呢?

论坛徽章:
0
9 [报告]
发表于 2010-05-28 16:25 |只看该作者
我的理解是地址  然后前面的是类型

论坛徽章:
0
10 [报告]
发表于 2010-05-28 16:31 |只看该作者
回复 7# climby


   试下这个。

  1. use Data::Dumper;
  2. my @var = ( 'a', 'b', 'c' );
  3. my $str =  \@var ;
  4. print Dumper $str;
  5. my $str2ref = "$str";
  6. print "string to reference:\n@{$str2ref}\n";
复制代码
主要是 $str2ref = "$str";这里
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP