Hi, 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 ? Thanks, Nitish -- 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/CALjMrq57bX8_9m-_qYT-CPqnHEOBm%2BygCUkopwZipt1tLCYquw%40mail.gmail.com.