我想写一个关于使用golang调用c函数的demo,我写了这个文件,发现它会恐慌,我不知道为什么。一、ac头文件p.h: void output(char* str, int s); void cc(char *str);二、ac文件p.c: #include<stdio.h> #include<stdlib.h> #include<unistd.h> void output(char* str, int s) { fflush(stdout); sleep(s); printf("%s", str); } void cc(char *str) { printf("%s", c_ccB(str)); }很简单,一个outputgo代码的cc函数和一个go代码中的函数调用c_ccB,最后一个go代码文件是p.go: package main /* #include<stdlib.h> #include "p.h" */ import "C" import "unsafe" import "fmt" //export c_ccB func c_ccB(cs *C.char) *C.char { gs := C.GoString(cs) return C.CString(gs + "wwww") } func main() { ch := make(chan int) task("A", ch, 5) task("B", ch, 1) fmt.Printf("begin\n") <-ch } func task(name string, ch chan int, s int) { go func() { i:= 1 for { str := ":" + name cstr := C.CString(str) C.output(cstr, C.int(s)) C.cc(cstr) C.free(unsafe.Pointer(cstr)) i++ } ch <- 1 }(); }go 代码只是两个 goroutime 不断打印一些字符串,如果 delete C.cc(cstr),它会正常工作,但为什么C.cc会引起恐慌?它只是调用func c_ccBgo。这是恐慌信息: begin :B:Bwwww:B:Bwwww:B:Bwwww:B:Bwwwwfatal error: unexpected signal during runtime execution [signal 0xb code=0x1 addr=0x900008e0 pc=0x7ff5973f8c80] runtime stack: runtime.throw(0x5438a0, 0x2a) /usr/local/go/src/runtime/panic.go:547 +0x90 runtime.sigpanic() /usr/local/go/src/runtime/sigpanic_unix.go:12 +0x5a
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
您错过了c_ccB
c 代码中的声明 。请加extern char* c_ccB(char*);
给你p.c
。
而且,您忘记释放分配给CString
in的内存c_ccB
。
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报
0/150
提交
取消