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.

Reply via email to