作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些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/
我是 Hyperledger Fabric 的新手。我正在阅读 Fabric 的文档最新版本,但我不清楚 Fabric 的共识。 Fabric 使用的共识是什么?它是如何工作的?请解释。 最佳答案 我
我看到了一些关于每个人现在在签名和未签名键值方面所做的事情的话题。似乎 unsigned 是最佳的,因为它允许以相同的成本增加两倍的行数。签名 key 有什么好处吗? 有没有标准的共识?答案似乎是签名
解析用于游标的短信 Uri 的共识是什么。必须有一种跨电话兼容的方式来访问短信。 sdk 里没有这样的东西吗? 将此作为 Uri 字符串怎么样:("vnd.android-dir/mms-sms");
我是一名优秀的程序员,十分优秀!