首页
社区
课程
招聘
C语言请教地址与指针!
发表于: 2006-12-30 16:11 6607

C语言请教地址与指针!

2006-12-30 16:11
6607
main()
{
int i=0;
char stuffing[44];
for(i=0;i<=40;i+=4)
*(long *) &stuffing[i]=0x80484bb;
puts(stuffing);

}
其中 *(long *) &stuffing[i]=0x80484bb的&,两个*,把我搞晕了,可否能一步一步的解释下它们的动作和结果,谢谢...

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
*(long *) &stuffing[i]=0x80484bb==> *((long*)(&stuffing[i]))
&stuffing[i]字符数组第i个字符所在地址
(long*)(&stuffing[i])把这个地址转化为long型的指针
*((long*)(&stuffing[i])) = 0x80484bb;对这个整型数据赋值
2006-12-30 16:27
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
上面的*(long *)&stuffing[i]=0x80484bb;等效下面的代码:

long *p;
p = (long *)&stuffing[i]; //将stuffing+i的偏移指针强制转换成long型指针。
*p = 0x80484bb; //将0x80484bb的值放到p指向的内存。
2006-12-30 16:27
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
北极星兄早了一步。
2006-12-30 16:28
0
雪    币: 201
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
*(long *) &stuffing[i]=0x80484bb;

stuffing[i]是一个char
&stuffing[i]取改char的地址 是char *类型(就是一个指向char型变量的指针)
(long *) &stuffing[i]强制类型转换 将char* 转变为long*(就是一个指向long型变量的指针)
*(long *) &stuffing[i]是对 (long *) &stuffing[i]解引用 也就是代表这个指针所指向的变量(因为指针是long*型,所以该变量变成了long型)

以上代码等效于下面的代码:
for(i=0;i<44;i++)
{
  switch(i%4):
  {
    case 0:
       strffing[i] = 0xbb;
       break;
    case 1:
       strffing[i] = 0x84;
       break;
    case 2:
       strffing[i] = 0x04;
       break;
    case 3:
       strffing[i] = 0x08;
       break;
    default:
       break;
  }
}
2006-12-30 16:41
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
版主们都很热情。

你们的热情,就像一把火……
2006-12-31 14:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哈哈总结一下:类型本不存在,类型转换只是想骗过编译器
2007-1-2 18:01
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
多谢各位的指点,明白了,
更明白一些以前不清楚的问题,多谢!
2007-1-4 10:52
0
雪    币: 221
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习
2007-1-7 10:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
C运算符的优先级
2007-1-7 21:16
0
雪    币: 191
活跃值: (335)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
11
最初由 jueguzi 发布
main()
{
int i=0;
char stuffing[44];
for(i=0;i<=40;i+=4)
........


没看懂这段代码意义何在?
2007-1-9 02:02
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不好意思,刚学溢出,有些还是不太明白请多指教
2007-1-9 08:07
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
*(long *) &stuffing=0x80484bb;

stuffing是一个char
&stuffing取改char的地址 是char *类型(就是一个指向char型变量的指针)
(long *) &stuffing强制类型转换 将char* 转变为long*(就是一个指向long型变量的指针)
*(long *) &stuffing是对 (long *) &stuffing解引用 也就是代表这个指针所指向的变量(因为指针是long*型,所以该变量变成了long型)

以上代码等效于下面的代码:
for(i=0;i<44;i+=4)/* 这里好像是我贴的时候弄错了~ */
{
switch(i%4):
{
case 0:
strffing = 0xbb;
break;
case 1:
strffing = 0x84;
break;
case 2:
strffing = 0x04;
break;
case 3:
strffing = 0x08;
break;
default:
break;
}
}


长整型是四个字节,怎么只是截取了8位??
2007-1-9 09:43
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
14
最初由 chinatme 发布
长整型是四个字节,怎么只是截取了8位??


明明是i+=4, 怎么变成了i++
2007-1-11 16:51
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不好意思仁兄是我弄错了~
2007-1-11 22:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
真好啊!!真的有很多热心人!大家交流交流可以学很多东西!我也想把自己的心得和大家分享!
2007-1-16 16:50
0
游客
登录 | 注册 方可回帖
返回
//