免费注册 查看新帖 |

Chinaunix

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

[函数] 高手问题:一个数组和函数地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-19 09:00 |只看该作者 |倒序浏览
忽然发现这个问题我还不知道:
int
main()
{
     char ss[20]=""
    printf("0x%x\n",ss);
    printf("0x%x\n",&ss);
}

打印出来的结果是ss=&ss,而如果换成 char *ss,则不同;将数组ss移到main外定义,并赋初值,结果相同;如果定义函数ss(),打印结果依然相同,谁能解释一下?

第二个问题:
void fun(char code[],int size)
{
    char temcode[6000]="";
    memset(temcode,0,6000);
    memcpy(temcode,code,size);
   //关键的这里
   ((void (*)(void))temcode )();//调用函数
    //请问这里是上面那样写还是((void (*)(void)) &temcode )(); 为什么?
   
}
int main()
{
     char code[]="\x12\x34.......";\\这里的代码是一段函数的16进制码,函数类型为void(*)(void)
   fun(code,sizeof(code));
}

[ 本帖最后由 lunight 于 2006-9-19 15:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-09-19 09:48 |只看该作者
ss本身就是地址
&ss就是说取ss这个地址的地址

所以一样

重新定义一个指针
会造成去地址不一样,使因为ss就是某个无力的别名(引用),而指针是一个变量。
变量有自己的地址

论坛徽章:
0
3 [报告]
发表于 2006-09-19 09:52 |只看该作者
存储ss这个单元的地址为什么和ss的内容一样?还是不懂

论坛徽章:
0
4 [报告]
发表于 2006-09-19 10:03 |只看该作者
char ss[128];

这样定义的数组名字ss是一个常数(代表一个地址)。
对常数不能再取地址。

但编译器设计者可能考虑有人不是很明白这个,会对ARRAY NAME常数取地址,那就给出还是那个常数。

论坛徽章:
0
5 [报告]
发表于 2006-09-19 10:05 |只看该作者
谢谢楼上的,不过第二个问题有人知道么?

[ 本帖最后由 lunight 于 2006-9-19 10:07 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-09-19 10:07 |只看该作者
没看懂你写的什么

论坛徽章:
0
7 [报告]
发表于 2006-09-19 10:23 |只看该作者
原帖由 lunight 于 2006-9-19 09:52 发表
存储ss这个单元的地址为什么和ss的内容一样?还是不懂

编译器会做隐式类型转换,把T[]类型转换成T*类型。

论坛徽章:
0
8 [报告]
发表于 2006-09-19 10:52 |只看该作者
((void (*)(void))temcode )();

分两步来看
typedef void (*FuncPtrType)(void);
定义一个函数指针类型,该指针所指向的函数返回值为void类型,接受参数为void型。
由于temcode所开始的存储区内存放一段代码。
((FuncPtrType)temcode)();
然后进行强制类型转换,也就是说,将从temcode的地址开始的数据当成一段函数的代码(代码满足上面的要求).写法虽然麻烦一些,但把它分割出来看就比较简单了。

也就是说,temcode数组内存放的是一个型如void functionName(void)类型的函数的反汇编代码。

论坛徽章:
0
9 [报告]
发表于 2006-09-19 11:02 |只看该作者

回复 1楼 lunight 的帖子

ss是数组类型,&ss是取数组的地址,返回的当然是数组的头指针;如果ss定义为char *; &ss的结果是指针的地址,所以会不一样。是数据类型的问题。数组也是一中数据类型。函数指针也是一种类型,函数名就是函数的指针(可以这样认为), &函数名,返回的就是函数地址,和函数名的结果一样。分清楚不同的数据类型就会搞明白

论坛徽章:
0
10 [报告]
发表于 2006-09-19 11:20 |只看该作者
原帖由 coldwarm 于 2006-9-19 10:52 发表
((void (*)(void))temcode )();

分两步来看
typedef void (*FuncPtrType)(void);
定义一个函数指针类型,该指针所指向的函数返回值为void类型,接受参数为void型。
由于temcode所开始的存储区内存放一段代码 ...



其实我也是这么想的,可是昨天看一篇文章里用的是((void (*)(void)) &temcode )();我也感觉很奇怪,可是人家的代码好像是对的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP