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

我想写一个关于使用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


小怪兽爱吃肉
浏览 111回答 1
1回答

慕村9548890

您错过了c_ccBc 代码中的声明&nbsp;。请加extern char* c_ccB(char*);给你p.c。而且,您忘记释放分配给CStringin的内存c_ccB。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go