当我从go中的函数返回一个新对象时,我很难理解究竟发生了什么。
我有这个
func createPointerToInt() *int {
i := new(int)
fmt.Println(&i);
return i;
}
func main() {
i := createPointerToInt();
fmt.Println(&i);
}
返回的值是
0x1040a128
0x1040a120
我希望这两个值是相同的。我不明白为什么会有8个字节的差异。
我认为是等效的C代码:
int* createPointerToInt() {
int* i = new int;
printf("%#08x\n", i);
return i;
}
int main() {
int* r = createPointerToInt();
printf("%#08x\n", r);
return 0;
}
返回的地址是相同的:
0x8218008
0x8218008
我在这里错过了一些令人眼花缭乱的东西吗?任何澄清将不胜感激!
答案 0 :(得分:7)
您正在此处打印指针的地址fmt.Println(&i);
。试试这个:
func main() {
i := createPointerToInt();
fmt.Println(i); //--> Remove the ampersand
}
i
是从createPointerToInt
返回的指针 - 而&i
是您尝试打印的指针的地址。请注意您的C示例中正确打印它:
printf("%#08x\n", r);
^No ampersand here
答案 1 :(得分:2)
将&i
更改为i
。您打印i的值时打印i的地址。
func createPointerToInt() *int {
i := new(int)
fmt.Println(i);
return i;
}
func main() {
i := createPointerToInt();
fmt.Println(i);
}
答案 2 :(得分:0)
但是原始代码中的两个指针的地址(指针指向的内存地址)是不同的呢?
func main() {
i := createPointerToInt();
fmt.Println(&i);
}
相当于:
func main() {
var i *int // declare variable i
i = createPointerToInt(); // assign value of
// a different i that was
// declared and initialized
// inside the function
fmt.Println(&i);
}
编辑:
要打印您需要使用的结构的地址:
fmt.Printf("%p\n", &your_struct)
例如: