如何从地址和大小打印字符串

How to print a string from address and size

提问人:Thang Ha 提问时间:7/5/2023 最后编辑:Jonathan HallThang Ha 更新时间:7/5/2023 访问量:51

问:

我想通过for循环从地址打印一个字符串。 下面是我写的代码,但它在正常运行和调试时给出不同的结果。

如何按 str 的地址按顺序打印 str 的每个字符。

请帮帮我。Tks you so muchhhh <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
    }
}
字符串 go 指针 字符 memory-address

评论

0赞 PRATHEESH PC 7/5/2023
你到底想得到什么?打印字符串中的每个字符或每个字符的地址?你试过吗?for range
0赞 Thang Ha 7/5/2023
@PRATHEESHPC我想从 str 打印每个字符。但是我想按字符串的地址打印值,不要使用 for for 从 str 的范围。

答:

2赞 mkopriva 7/5/2023 #1

尝试不起作用的原因是返回字符串标头的地址,而不是字符串数据的地址。如果需要字符串数据的地址,则需要先转换为字符串标头,然后通过标头访问数据。您可以使用声明的反射。StringHeader 要做到这一点,只需确保你阅读了它的文档并理解它所说的内容&str&str

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)                                  
    }
}

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

评论

1赞 Thang Ha 7/5/2023
非常感谢,它回答了我所有的问题!