c - 如何与CGO达成共识?

标签 c go cgo

我有一些C代码来获取似乎有效的realpath:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

char* getrpath(char *symlink) {
    char *symlinkpath = symlink;
    char actualpath [PATH_MAX];
    symlink = realpath(symlinkpath, actualpath);
    return symlink;
}


int main(int argc, char *argv[]) {
    char *symlinkpath = argv[0];
    symlinkpath = getrpath(symlinkpath);
    printf("%s\n", symlinkpath);
    return 0;
}
我正在尝试为其创建包装器(仅出于学习目的):
package main

/*
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

char* getrpath(char *symlink) {
    char *symlinkpath = symlink;
    char actualpath [PATH_MAX];
    symlink = realpath(symlinkpath, actualpath);
    return symlink;
}
*/
import "C"
import (
    "fmt"
    "os"
    "path"
    "unsafe"
)

func getArgv() string {
    return fmt.Sprintf("./%s", path.Base(os.Args[0]))
}

func main() {
    slink := C.CString(getArgv())
    defer C.free(unsafe.Pointer(slink))
    ret := C.getrpath(slink)
    fmt.Println(C.GoString(ret))
}
我无法将值返回到main()Golang函数中。如果我在C getrpath()函数中放置了打印件,它将打印路径。任何提示,不胜感激。

最佳答案

问题是您的C函数正在返回在C堆栈上分配的内存,这在C中是未定义的行为(实际上可能会导致垃圾值):

char* getrpath(char *symlink) {
    char *symlinkpath = symlink;
    char actualpath [PATH_MAX];
    symlink = realpath(symlinkpath, actualpath);
    return symlink;
}
您需要返回堆分配的内存。像这样:
char* getrpath(char *symlink) {
    char *actualpath = malloc(PATH_MAX);
    return realpath(symlink, actualpath);
}
或更简单地说-因为如果您为第二个参数传递NULL,则getpath定义为malloc内存本身:
char *getrpath(char *symlink) {
    return realpath(symlink, 0);
}
(我还删除了您引入的变量,但这不是编辑的重要部分)。

关于c - 如何与CGO达成共识?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62568431/

相关文章:

c - O3 优化标志使并行处理的加速变得更糟

c - 测量任何编程语言的程序的时间复杂度

c - CGO对“TIFFGetField”的 undefined reference

转到转换为 *ptrdiff_t 的类型?

c - 通过指向指针的指针修改数组元素

c - FORTRAN 比 C 快 - 对于在同一处理器上运行的矩阵乘法程序,为什么?

go - 我如何 fork 一个 go 过程?

google-app-engine - 执行 : "gcc": executable file not found in $PATH

go - 从 Go 闭包返回一个方法

go - 使用 golang 时无法从 cgo 例程中获取带有核心文件的堆栈跟踪