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 就是不安全,如果你不知道自己在干什么,就不要用。


    推荐阅读