我想通过for循环从地址打印一个字符串。 下面是我写的代码,但是正常运行和调试时给出的结果是不同的。
如何按 str 的地址顺序打印 str 的每个字符。
请帮助我。非常感谢你hhhh <3
这是我的代码!!!
package main import ( "fmt" "unsafe" ) func main() { str := "Hello, World!" startAddr := uintptr(unsafe.Pointer(&str)) // Get the address of the string variable for i := 0; i < len(str); i++ { ptr := (*byte)(unsafe.Pointer(startAddr + uintptr(i))) // Calculate the pointer address fmt.Printf("%c", *ptr) // Dereference the pointer to get the character } }
您的尝试不起作用的原因是 &str
返回字符串 header 的地址,而不是字符串的 data 的地址。如果想要字符串数据的地址需要先将&str
转换成字符串头,然后通过头来访问数据。您可以使用声明的 reflect.stringheader
来执行此操作,只需确保您阅读其文档并理解其内容。
func main() { str := "Hello, World!" header := (*reflect.StringHeader)(unsafe.Pointer(&str)) for i := 0; i < len(str); i++ { ptr := (*byte)(unsafe.Pointer(header.Data + uintptr(i))) fmt.Printf("%c", *ptr) } }