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;
}

Java コードからこの関数に整数値 5 を渡しています。上記の関数を実行しようとすると、次のエラーが発生しました。

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 に答える