c - 如何使用 CGO 获得 realpath?
问题描述
我有一些 C 代码来获取似乎有效的真实路径:
#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);
}
(我还删除了您介绍的变量,但这不是编辑的重要部分)。
推荐阅读
- java - 尝试在 vscode 中运行 fx 时,JavaFX“错误:缺少 JavaFX 运行时组件,并且需要运行此应用程序”
- java - 基于字符串输入动态更改二维数组的 Java 代码
- amazon-web-services - 亚马逊AWS上的godaddy ssl证书
- flutter - 释放按钮后颤振启用事件
- jsonschema - 具有数组属性的多组枚举的 JSON 模式定义
- c# - 如何获取我在 Unity 中单击的像素的颜色?是否有适用于浮点数的 GetPixel 替代方案?
- ejb-3.0 - 我可以将这个 EJB 的资源传递给另一个 EJB 吗?
- angular - 从服务中获取组件中的变量值?
- angular - 使用 updateOn:'submit' 时检测 Angular 中的表单更改
- java - 如何从布尔变量中获得两个以上的答案?