亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

字符串復制內存地址的 Golang 內存分配

字符串復制內存地址的 Golang 內存分配

Go
qq_笑_17 2022-10-31 15:49:16
我目前正在閱讀 Go 編程語言書,該書描述了字符串或子字符串的副本具有相似的內存地址。s := "hello"c := sfmt.Println(&s, &c) // prints 0xc000010230 0xc000010240我的問題是,不應該&c和&s因為它c是一個精確的副本一樣嗎?               RAM      Address    |     Value &s 0xc000010230 |    "hello" <----- s &c 0xc000010240 |    "hello" <----- c
查看完整描述

1 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

c并且s實際上是兩個不同的字符串標題。但他們都指向同一個"hello"。


sh := (*reflect.StringHeader)(unsafe.Pointer(&s))

ch := (*reflect.StringHeader)(unsafe.Pointer(&c))

fmt.Println(sh.Data, ch.Data)

https://go.dev/play/p/Ckl0P3g4nVo


字符串頭的Data字段指向字符串中的第一個byte,字符串頭的Len字段表示字符串的長度。您可以使用該信息來確認字符串標頭是否指向原始字符串。


sh := (*reflect.StringHeader)(unsafe.Pointer(&s))

for i := 0; i < sh.Len; i++ {

    sp := (*byte)(unsafe.Pointer(sh.Data + uintptr(i)))

    fmt.Printf("%p = %c\n", sp, *sp)

}

https://go.dev/play/p/LFfdxxARw1f


查看完整回答
反對 回復 2022-10-31
  • 1 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號