最近发布的主题
暂无
最近发布的文章
暂无
最近分享的资源
暂无
最近发布的项目
暂无
最近的评论
-
oh
-
#17楼 @terender ```golang a := 2 b := 3 if &b != nil { } c := (*string)(unsafe.Pointer(&a)) *c = "44" fmt.Println(*c) fmt.Println(len(*c)) fmt.Println(b) fmt.Println(&a, &b) ``` 这种现象怎么解释。。a,b的内存不连续的时候,直接赋值,能赋值,那a之后的那8个字节是谁占用的呢??println函数内部吗? 
-
#29楼 @af913337456 结合这个反例 ``` func fun1() { var a int = 2 var b int = 3 fmt.Println(&a) fmt.Println(&b) c := (*string)(unsafe.Pointer(&a)) fmt.Println(len(*c)) *c = "44" fmt.Println(*c, len(*c)) fmt.Println(b) } ``` 结果:注意 a,b的内存地址差了24位 ``` 0xc04204e328 0xc04204e340 7811852430209544791 44 2 3 ```
-
#29楼 @af913337456 和fmt.Println没关系,跟b:=3有关系,他之所以fmt.Println(b),就是单纯的打印出来而已,你不打印,,照样有用,,
-
不是fmt.Println(b) 保护a的内存地址 是在a之后,紧接着又申请了一个b的内存空间大小,a和b的内存空间连在一起共16个字节,正好够stringHeader使用,b的作用就是在a的后边申请一个空间,将这个空间保护起来给a用。