1

我在 ubuntu 上使用库libfprint,我试图通过我的 java 代码调用一个函数。

API_EXPORTED struct fp_img *fpi_img_new(size_t length)
{
    struct fp_img *img = g_malloc(sizeof(*img) + length);
    memset(img, 0, sizeof(*img));
    fp_dbg("length=%zd", length);
    img->length = length;
    return img;
}

我将整数值 5 从我的 java 代码传递给这个函数。当我尝试执行上述功能时,出现以下错误:

GLib-ERROR **: /build/buildd/glib2.0-2.30.0/./glib/gmem.c:170: failed to allocate 3077591024 bytes

我在 2 台不同的 ubuntu 机器上尝试了相同的代码,但错误仍然相同。我不知道为什么它试图为 24+5 长度分配这么多字节。

谁能建议我任何解决方案?

4

4 回答 4

2

源代码明确指出:

/* structs that applications are not allowed to peek into */
(...)
struct fp_img;

所以,我不确定你做了什么来编译需要大小的东西struct fp_img:你不应该这样做,因为结构声明是不透明的。

于 2013-08-12T13:54:56.090 回答
1

看起来你得到一个指针而不是一个size_t. 尝试将您的定义更改为:

API_EXPORTED struct fp_img *fpi_img_new(size_t * length);

然后你需要取消引用它:

API_EXPORTED struct fp_img *fpi_img_new(size_t * length)
{
    struct fp_img *img = g_malloc(sizeof(*img) + *length);
    memset(img, 0, sizeof(*img));
    fp_dbg("length=%zd", *length);
    img->length = *length;
    return img;
}

注意:似乎 3077591024 在堆栈(0x125807FE)上,它高度依赖于平台,所以不要引用我的话。

于 2013-08-12T13:55:07.857 回答
0

如果你改变会发生什么

sizeof(*img)

sizeof(struct fp_img)

? 我认为这可能是您的问题,因为在您调用 g_malloc() 时 *img 未初始化为任何内容。

于 2013-08-12T13:21:32.280 回答
-1

错误:结构 fp_img *img = g_malloc(sizeof(*img) + length);

*img 是新创建的,所以你不能像“sizeof(*img)”那样使用它,你可以这样写:“sizeof(struct fp_img)”

于 2013-08-12T14:32:48.343 回答