2

基本上,我的代码在 NucleoProf_init 中崩溃,从 gdb 的堆栈跟踪以及我调用的唯一函数这一事实来看。

#include <HsFFI.h>

static char *argv[] = {"NucleoProf", "", "", 0};
static int argc = 1;

HsBool NucleoProf_init(void){

   // Initialize Haskell runtime
   hs_init(&argc,  (char***)&argv );

   return HS_BOOL_TRUE;
}

我怀疑这是我传递 argv 参数的方式,或者可能是 argv 的类型转换,因为堆栈跟踪包含以下内容:

#3  0x00007ffff5956282 in setFullProgArgv ()
    from /usr/lib/ghc/libHSrts-ghc7.4.1.so
#4  0x00007ffff5956d04 in hs_init_ghc () from /usr/lib/ghc/libHSrts-ghc7.4.1.so
#5  0x00007ffff5b9ed4f in NucleoProf_init ()

问题:这是“合成”一个简单命令行的正确方法吗?

4

2 回答 2

4

你可以试试这个:

char ** p = argv;
hs_init(&argc, &p);

目前尚不清楚为什么需要按地址传递数组,但我不知道您使用的 API。仔细检查手册以查看函数是否可以更改这些值,以及是否需要在之后处理它们。

于 2012-12-02T16:53:17.910 回答
2

这是错误的,因为首先,它是错误的类型。获取数组的地址会产生指向数组的指针。&argv具有 type char *(*)[4],即“指向 4 个指向 char 的指针的数组的指针”。这不是char ***您想要的类型。您正在强制转换它以隐藏类型不兼容。

你想要一个char ***,它是一个指向实际char **变量的指针。但是您在任何地方都没有char **变量。你有argv一个char *[4]完全不同的变量。数组变量就是这样——它在内存中按顺序排列的元素的集合;内存中任何地方都没有存储任何东西的地址。

您的基本困惑可能是数组不是指针这一事实。数组有不同的大小(数组的大小是它的长度乘以它的组件类型的大小)、指针和数组类型(指向数组的指针与指向指针的指针非常不同;与数组数组和指针数组相同) ) 和语义(不能分配或传递数组)。在某些情况下,数组表达式可以隐式降级为指针右值;但在这种情况下,您正在获取需要左值的地址,因此它不适用。永远不要将数组与指针混淆。

于 2012-12-02T20:51:04.270 回答