Hi Ian, So what did I do :
main.go ======== var InitStruct *C.struct_Foo; func InitializeEngine(pattern string, path string) { pattern_db := C.CString(pattern) module_path := C.CString(path) if InitStruct != nil{ C.free(unsafe.Pointer(InitStruct)) } InitStruct := (*C.Foo)(C.calloc(1, C.sizeof_struct_Foo)) InitStruct.cb = (C.key_value_cb)(C.callOnMeGo_cgo) InitStruct.data = C.int(5) fmt.Println(InitStruct) <<<<<<<<<<<<<<<<<<<<'&{0x4b7cb0 5 [0 0 0 0]}' got printed fmt.Printf("%p\n", InitStruct) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'0x1905630' got printed C.initialize_engine(pattern_db, module_path, InitStruct) } func ReloadPatternDB(patterndb string) { if InitStruct != nil{ fmt.Println(InitStruct) <<<<<<<<<<<<<<<'&{0x4b7cb0 5 [0 0 0 0]}' got printed fmt.Printf("%p\n", InitStruct) <<<<<<<<<<<<<'0x1905630' got printed C.free(unsafe.Pointer(InitStruct)) fmt.Printf("%p\n", InitStruct). <<<<<<<<<<<'0x1905630' got printed ...Older memory address getting printed even after freeing the memory [*a]* fmt.Println(InitStruct). <<<<<<<<<<<<<<'&{0x863b470 5 [0 0 0 0]}' got printed. Why is struct fields getting printed? *[b]* } path := C.CString(patterndb) InitStruct = (*C.Foo)(C.calloc(1, C.sizeof_struct_Foo)) InitStruct.cb = (C.key_value_cb)(C.callOnMeGo_cgo) InitStruct.data = C.int(5) fmt.Println(InitStruct) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< '&{0x4b7cb0 5 [0 0 0 0]}' got printed C.reload_pattern_db(path, InitStruct) <<<<<<<<<. '0x9031d40' got printed } InitStruct is a global variable.I am calling C functions 'initialize_engine' and 'reload_pattern_db' respectively. 1) Even after freeing the memory in 'reload_pattern_db', the older memory address is getting printed.Why? *[a]* 2) Do I have to explicitly point 'InitStruct=nil' after freeing the memory. 3) Why is 'fmt.Println(InitStruct)' printing the struct fields even after freeing the memory ? *[b]* Please clarify what am I missing here ? Thanks, Nitish On Fri, Mar 6, 2020 at 12:19 AM Ian Lance Taylor <i...@golang.org> wrote: > On Wed, Mar 4, 2020 at 10:06 PM Nitish Saboo <nitish.sabo...@gmail.com> > wrote: > > > > Thank you for the response.Got it. > > Basically, fmt.Println(InitStruct) is printing the values of fields, cb > and data, for the struct Foo pointed by InitStruct. > > fmt.Printf("%p\n", InitStruct) is printing the memory address. > > Btw..can you please clarify the following : > > > > 1)Is this the correct way to pass a C struct from a Go code to C code. > > Sure, this is fine. There are other ways also, but this approach is fine. > > > 2) Can I free the struct memory assigned to Initstruct using calloc on > Go side in the following manner ? > > > > if InitStruct != nil{ > > C.free(unsafe.Pointer(InitStruct)) > > } > > Yes. > > Ian > > > On Wed, Mar 4, 2020 at 11:19 PM Ian Lance Taylor <i...@golang.org> > wrote: > >> > >> On Wed, Mar 4, 2020 at 3:57 AM Nitish Saboo <nitish.sabo...@gmail.com> > wrote: > >> > > >> > I have CGO project. > >> > > >> > Following is my C header file and Go code > >> > > >> > syslog-node.h > >> > =============== > >> > > >> > #ifndef _TEST_H_ > >> > #define _TEST_H_ > >> > > >> > #include <stdlib.h> > >> > > >> > typedef void (*key_value_cb)(const char* key, const char* value, > size_t value_len, int work); > >> > typedef struct Foo{ > >> > key_value_cb cb; > >> > int data; > >> > }Foo; > >> > int initialize_engine(const char* filename, const char* module_path, > Foo *cb); > >> > int reload_pattern_db(const char* filename, Foo *cb); > >> > > >> > > >> > cfunc.go > >> > ======== > >> > /* > >> > > >> > #include <stdio.h> > >> > > >> > // The gateway function > >> > void callOnMeGo_cgo(char *key, char *value, size_t value_len, int > work) > >> > { > >> > void ParsedData(const char *key, const char *value, size_t value_len, > int work); > >> > ParsedData(key, value, value_len, work); > >> > } > >> > */ > >> > import "C" > >> > > >> > main.go > >> > ======== > >> > > >> > var InitStruct *C.struct_Foo; > >> > > >> > func InitializeEngine(pattern string, path string) { > >> > pattern_db := C.CString(pattern) > >> > module_path := C.CString(path) > >> > if InitStruct != nil{ > >> > C.free(unsafe.Pointer(InitStruct)) > >> > } > >> > InitStruct := (*C.Foo)(C.calloc(1, C.sizeof_struct_Foo)) > >> > InitStruct.cb = (C.key_value_cb)(C.callOnMeGo_cgo) > >> > InitStruct.data = C.int(0) > >> > fmt.Println(InitStruct) <<<<<<<<<<<<<<<<<<<<<<<<<<<'&{0x4b79d0 0 [0 > 0 0 0]}' got printed > >> > C.initialize_engine(pattern_db, module_path, InitStruct) > >> > > >> > } > >> > > >> > func ReloadPatternDB(patterndb string) { > >> > > >> > path := C.CString(patterndb) > >> > InitStruct = (*C.Foo)(C.calloc(1, C.sizeof_struct_Foo)) > <<<<<<<Allocating a new memory > >> > InitStruct.cb = (C.key_value_cb)(C.callOnMeGo_cgo) > >> > InitStruct.data = C.int(0) > >> > fmt.Println(InitStruct) <<<<<<<<<<<<<<<<<<<<<<<<<<< '&{0x4b79d0 0 > [0 0 0 0]}' got printed > >> > C.reload_pattern_db(path, InitStruct) > >> > > >> > } > >> > > >> > > >> > I have a Go code where I have to call C functions 'initialize_engine' > and 'reload_pattern_db' respectively(one after the other ) and pass the C > struct from Go code. > >> > > >> > > >> > The issue is after allocating memory to 'InitStruct' using calloc in > 'InitializeEngine' method, the same memory location is getting printed in > ReloadPatternDB method even though I am allocating a new memory to > 'InitStruct' using calloc in 'ReloadPatternDB' method. > >> > > >> > 1) Is this the correct way to pass a C struct from a Go code to C > code. > >> > 2) Is this a correct way to free the struct memory assigned to > InitStruct using calloc on Go side ? > >> > >> You haven't showed us where the same memory location is getting > >> printed. Note that fmt.Println is not printing the address of > >> InitStruct; it is printing the values of the fields. If you want to > >> print the address, use fmt.Printf("%p\n", InitStruct). > >> > >> Also note that InitStruct is a global variable. > >> > >> Ian > -- 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 golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CALjMrq6twUXXggOOPTyE115D4XAxKjZsXzNYWPEqypu4dMRy4w%40mail.gmail.com.