为了账号安全,请及时绑定邮箱和手机立即绑定

对为什么这个 cgo 代码恐慌感到困惑

对为什么这个 cgo 代码恐慌感到困惑

Go
小怪兽爱吃肉 2022-01-10 19:04:34
我想写一个关于使用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_ccBc 代码中的声明 。请加extern char* c_ccB(char*);给你p.c

而且,您忘记释放分配给CStringin的内存c_ccB


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信