Thank you for your detailed answer. I thought it would crash in this line (b.Z = "zz") of code. But it dose not happen and the program print "zz". I don't understand why this program crash in return, not in b.Z = "zz". Because I agree with your opinion, The field Z of (*b) is beyond the memory that was allocated on the heap or reserved on the stack for a.
On Tuesday, August 14, 2018 at 9:57:05 PM UTC+8, Marvin Renich wrote: > > * sheepbao <[email protected] <javascript:>> [180813 23:45]: > > go version > > go version go1.10.2 darwin/amd64 > > > > test code: > > > > func TestPoint(t *testing.T) { > > type A struct { > > X int > > Y string > > } > > type B struct { > > X int > > Y string > > Z string > > } > > > > a := A{X: 2, Y: "yy"} > > b := (*B)(unsafe.Pointer(&a)) > > b.Z = "zz" > > > > fmt.Printf(" z: %v\n", b.Z) > > return > > } > > Enough bytes are allocated for a (of type A). It doesn't matter whether > they are on the stack or on the heap. Now you use unsafe to make b a > pointer to type B that points to the same memory location where a was > allocated. The field Z of (*b) is beyond the memory that was allocated > on the heap or reserved on the stack for a. Neither the compiler (for > stack-reserved a) nor the runtime (for heap-allocated a) has made any > provision for ensuring that the memory immediately beyond a is not used > for anything else. Writing to b.Z overwrites memory to which b has no > claim. > > Both this code and the change in your subsequent message are simply > wrong. Whether it crashes or not depends on the legitimate "owner" of > the memory at b.Z. If it is a return address on the stack, a crash is > almost certain. If it is memory on the heap that has not been allocated > yet, and will never be allocated in such a simple program, you might not > see any evidence that the code was written incorrectly. > > ...Marvin > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
