Golang 里面 unsafe.Pointer 的机制的疑问
画内存布局图一个个分析就出来了,你这样用就跟c里面直接改内存差不多了
fun2没啥好说的,跟unsafe关系不大,就是c指向a,然后通过c改了a的内容
fun3,是用一个string指针指向一个int所占内存,然后取string的值赋值给c,这个取值(读)过程已经越界了,因为string的赋值是一个结构体,读到了a和a后面的内存,不过这个内存也是合法的,所以c的赋值这句没崩(但c的值这时候是有问题的),然后你立刻给c赋值了一个新字符串,冲掉了非法值,再打印c当然没问题
fun1有问题,因为你直接把a所在内存区域当成是一个string并且赋值,write了a所在区域和a后面的区域,写越界了,这时候可能暂时没有报错,但是越界写不保证改了哪里,可能改了c自己,也可能被Println调用时覆盖内容,所以输出有问题了
■网友
官方编译器中string类型的结构是这样的type string { data *byte length int}建议你把转换后的字符串长度打印出来就知道怎么回事了.
你这种从一个size较小的类型值转换到size较大的类型值一般都是不合法的.
你可以将一个slice转换到string, 但将一个string转换到slice, 或者将一个int转换到string一般都是不合法的.
你的程序充满了不确定行为.
■网友
希望有大佬能帮我解答下,资料查阅无果。这里再粘贴下这三个方法func fun1() {\ta := 2\tc := (*string) (unsafe.Pointer(\u0026amp;a))\t*c = "44"\tfmt.Println(*c) // }func fun2() {\ta := "654"\tc := (*string) (unsafe.Pointer(\u0026amp;a))\t*c = "44"\tfmt.Println(*c) // 44}func fun3() {\ta := 3\tc := *(*string) (unsafe.Pointer(\u0026amp;a))\tc = "445"\tfmt.Println(c) // 445}
■网友
【Golang 里面 unsafe.Pointer 的机制的疑问】 为什么你要转换指针的类型?unsafe 就是不安全,如果你不知道自己在干什么,就不要用。
推荐阅读
- 车车人|为什么老司机进隧道开车时都不愿走右侧车道?原来里面大有学问!
- 在英雄联盟里面跟别人solo有啥技巧吗一对一的那种〒_〒?
- 为啥滴滴和快的的专车业务在叫车的产品流程里面没有参考uber的派单的模式而是继续采用司机抢单的模式
- 男子眼睛不适一年多,去医院一看,里面竟有一小截树枝!
- 电池|最近上市的新车里面居然有超多SUV?最帅的都在这了
- 请问这段代码是啥意思,从一个仿造网站上下载的软件里面的,对电脑有危害吗
- 胖哥汽车|火花塞只坏了1个,修车工却全部换新,里面到底有什么猫腻?
- ucloud售前架构师怎样在销售团队里面的职责主要是啥
- 有个很火视频里面女主角走后,看起来有点邋遢的男主角捂着心口痛哭,是哪部电影
- Wordpress新版4.8.1设置-常规里面域名url不可以更换
