Golang 中国

问 fun1 和 fun2 fun3 分别输出什么,为什么?

func fun1()  {
    a := 2
    c := (*string) (unsafe.Pointer(&a))
    *c = "44"
    fmt.Println(*c)
}

func fun2()  {
    a := "654"
    c := (*string) (unsafe.Pointer(&a))
    *c = "44"
    fmt.Println(*c)
}
func fun3()  {
    a := 3
    c := *(*string) (unsafe.Pointer(&a))
    c = "445"
    fmt.Println(c)
}

问 fun1 和 fun2 fun3 分别输出什么,为什么?


af913337456 于 2018-03-18 22:07 修改
6 回复
dwcz
#1 dwcz • 2018-03-27 19:12

自己跑跑不就知道了吗。
func1中C是字符串指针。func2中C是字符串指针。func3中C是字符串。
分别是44,44,445。这同unsafe.Pointer没啥关系。


以上不是重点。重点是在我的机器上(win10俄神精简版,golang1.10,liteIDE,system)
func1中Println的表现很怪异。只有一个时输出是空。两个时最后一个是空。后接Printf时正常。或接一个调用len(*c)也正常。但后接赋值不会改变。
想问问,其他人这样吗?


// 000 project main.go
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fun1()
    fun2()
    fun3()
}
func fun1() {
    a := 2
    c := (*string)(unsafe.Pointer(&a))
    *c = "44"

    fmt.Println(*c)
    // fmt.Printf("%s\n", *c)
    // fmt.Println(len(*c))
    //    fmt.Println(*c)
    //    for i, v := range *c {
    //        fmt.Printf("%x\n", i)
    //        fmt.Printf("%x\n", v)
    //    }
}
func fun2() {
    a := "654"
    c := (*string)(unsafe.Pointer(&a))
    *c = "44"
    fmt.Println(*c)

}
func fun3() {
    a := 3
    c := *(*string)(unsafe.Pointer(&a))
    c = "445"
    fmt.Println(c)

}
ayanmw
#2 ayanmw • 2018-04-04 12:44

前两个 c的地址值和&a是一样的, 所以*c="xxx" 是将xxx 拷贝到目标地址,对&c的更改会影响到a

第三个 是&c的地址和&a的地址就不一样,就是两个变量了; 对c的更改不影响a;

fanyang
#3 fanyang • 2018-04-04 14:36

fun1结果:空,整型指针不允许赋值字符指针,相反就可以,所以c是空指针,存放”44”时无效;
fun2结果:44,可以不用Pointer转换;
fun3结果:445,c的地址还是空,只不过不是往地址里存放值

cz000
#4 cz000 • 2018-04-20 17:20
func fun1() {
    a := 2
    c := (*string)(unsafe.Pointer(&a))
    *c = "44"
    fmt.Println(*c)
    fmt.Println(a)
}


func fun1() {
    a := 2
    c := (*string)(unsafe.Pointer(&a))
    *c = "44"
    fmt.Println(*c)
    //fmt.Println(a)
}

func fun1() {
    a := 2
    c := (*string)(unsafe.Pointer(&a))
    *c = "44"
    fmt.Println(a)
    fmt.Println(*c)
}

fun1三种结果输出的都不同,在Ubuntu64位
go version go1.7.1 linux/amd64
应该不建议这么做吧,有没有大神解释一下

aaaaaaaa1
#5 aaaaaaaa1 • 2018-04-22 13:37

unsafe包好好看看都有案例.

xinyu391
#6 xinyu391 • 2018-05-13 21:14

无聊的问题,有谁这么去开发程序,我就直接把他开了。

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。