gpt4 book ai didi

c - 如何与CGO达成共识?

转载 作者:行者123 更新时间:2023-12-01 21:09:46 24 4
gpt4 key购买 nike

我有一些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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com