Re: [问题] address的问题

楼主: kerwinhui (kezza)   2014-08-28 16:27:51
※ 引述《kdok123 (小天)》之铭言:
: 对不起问题有点混乱了,其实只是想知道pointer和reference后面到底是怎么运作的
: EX:
假设是在 64-bit 的环境,sizof(void*)=8, sizeof(int)=8
: int a[] = {1,2,3,4,5};
: int *k = a;
: int **k2 = &k;
: int ***k3 = &k2;
: cout<< k << ' ' << a << ' ' << endl;//此时k和a是相同的位址
: cout << *(*(&a+1)-1) << endl; //输出5

a 的位置是 0x10000000,64-bit int,所以占8格至 0x10000007
a[1] 的位置是 0x10000008 (至 0x1000000F)
a[2] 的位置是 0x10000010
a[4] 的位置是 0x10000020 (至 0x10000027)
因为你用了 int a[]={...} 的宣告,所以 a 的 type 是 int[5]
所以 &a 是一个(int[5])*,它的运算是以 int[5] 为准,也就是说
*(&a+1) 是个int[5],指向的是 a[0] 后的第5个int
*(&a+1)-1 是个int ,指向的是 a[0] 后的第4个int,即 a[4]
所以 *(*(&a+1)-1)=a[4]=5
: cout << *(*(&k+1)-1) << endl; //这个地方是印不出来的,错误是未初始化变量k
例(续)
k 的位置假设是 0x20000000 至 0x20000007
k 只是一个int* (不是int[5]喔),所以 &k+1 指向的是k后面的一个int*,即位置
0x20000008 至 0x2000000F (把这 8-byte 解读成 int*)
但问题来了,这个位置不一定是你的!所以 *(&k+1) 就会亮起警报:
这程式不会是想偷什么资料吧?
所以之后的运算也作不下去了
: 我的认知这里应该也要输出5
: 不知道观念哪里有问题了呢?
有两个明显问题:
1. k 和 a 只是指向的位置相同,它们本身的位置并不同
2. 就算本身位置相同,他们指向的 type 也不相同,运算也会不同
: (会想这个例子是因为想知道*(&k+1),**(&k2+1)到底会前进几个int,
: 只是在第一步就卡住了)
不会前进几个int,因为本不该你看到,如果看到的话是系统安全漏洞!(像
几个月前 Heartbleed 这样的问题)
作者: purpose (秀才遇到肥宅兵)   2014-08-28 16:38:00
作者: kdok123 (小天)   2014-08-28 17:47:00
理解了!! 感激各位的帮忙!!
作者: MIKEmike07 (加油!)   2014-08-28 19:41:00

Links booklink

Contact Us: admin [ a t ] ucptt.com