Re: [问题] 指标的指标

楼主: sarafciel (Cattuz)   2018-05-28 23:55:20
※ 引述《zzss2003 (brotherD)》之铭言:
: 开发平台(Platform): Win7
: 编译器: GCC
: 额外使用到的函数库(Library Used): No
: 问题(Question): int **arr = (int**)malloc(c*sizeof(int))
: 程式码(Code):https://ideone.com/e.js/kHRJmp
: 第八行(int **arr)做完小弟的理解是像这样: https://imgur.com/a/d6kJniE
: 其中ABC因为还没有给值,所以用变量表示。
: 当执行arr = (int**)malloc(c*sizeof(int*))
: malloc所给予的是一个ptr,这个ptr是指向**int,所以这个ptr的value就会取代A所以图就变成这样(图二): https://imgur.com/a/d6kJniE
: 问题:
: 1. malloc最后所allocate的大小是3*4bytes = 12bytes,但在我画的图中,B的size只有
: 4bytes,要如何放得下12bytes?
: 谢谢
因为你误解指标了,而且图也没画对XD
指标里面存的东西是位置,32bit的机器上就是4byte,64bit的机器上就是8byte
当你做malloc的时候实际上是在heap要一块内存,然后把这块内存的开头位置给指标
打个烂比方,某人A有4坪的连号房子三栋,而B(指标)所谓的"知道A的地址"这件事
不是把三栋房子的位置抄在12坪上
而是把第一栋房子的位置抄在自己的4坪上,如果你要找A的第二栋房子
那就自己走到第一栋的位置 再走4坪的路这样
而要走几坪的路这件事 编译器会帮你搞定
所以如果你在32bit的机器上写一个(int *)型态的ptr做++,
或是用阵列存取的方式(ptr[0]、ptr[1]....ptr[i])
前者实际上在底层的组语是在做ptr+4,后者就是ptr+4*i
所以你上面那段code画成图实际上是长这样,本人字丑拜托不要呛我QQ
(图上的内存位置只是举例而已,请不要当真)
https://imgur.com/a/Qa84v2x
大概是这样
作者: MOONRAKER (㊣牛鹤鳗毛人)   2018-05-29 08:07:00
手工图片推一个 XD
作者: jojojen (JJJ)   2018-05-29 11:47:00

Links booklink

Contact Us: admin [ a t ] ucptt.com