duanfei8897
2014-05-14 15:07
浏览 211
已采纳

通过go函数的参数返回值,该函数从C调用

Suppose, we've got a Go function, which is doing something with agruments, passed to them, e.g. it could fill the buffer, allocated in the C part and changing it and for example an integer argument, which is a size of read data. It works well with an integer one, but not with a "data part". Just see a code.

package main

/*

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>

extern int some(uint8_t *, int *);

static int somewrap() {
    uint8_t *i = malloc(16);
    int A = 1;
    int *x = &A;

    some(i, x);

    fprintf(stderr, "c.wrapper, i=%s, %p, x=%d, %p
", i, i, *x, x);

    return 0;
}

*/
import "C"

import "fmt"
import (
    "unsafe"
)

//export some
func some(i *C.uint8_t, x *C.int) C.int {
    fmt.Println("i:", i, &i, *i, "x:", x, &x, *x)

    p := []byte("xxx")
    i = (*C.uint8_t)(unsafe.Pointer(&p[0]))

    *x = C.int(42)

    fmt.Println("i:", i, &i, *i, "x:", x, &x, *x)
    return C.int(0)
}

func main() {
    C.somewrap()
}

As a result, we've got following:

i: 0x4303a40    0xc210000018 0   x: 0x7fff5fbff874 0xc210000020 1
i: 0xc210000038 0xc210000018 120 x: 0x7fff5fbff874 0xc210000020 42
c.wrapper, i=, 0x4303a40, x=42, 0x7fff5fbff874

As you can see, it works well for integer pointer, but not for uint8_t.

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • doupo2633 2014-05-14 16:13
    已采纳

    You're re-assigning i within some to another address, not change the value at the given address (unless I'm misunderstanding what you're trying to accomplish)

    *i = *(*C.uint8_t)(unsafe.Pointer(&p[0]))
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题