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/CAOyqgcVgi6u3MCCX1OBywhOHysOe7kZ5RG_CDb4Hoxd24JBaZw%40mail.gmail.com.