Erreur d’allocation de mémoire Glib

J’utilise une bibliothèque libfprint sur ubuntu et j’essaie d’appeler une fonction via mon code 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; } 

Je passe la valeur entière 5 de mon code java à cette fonction. Lorsque j’essaie d’exécuter la fonction ci-dessus, j’ai des erreurs suivantes:

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

J’ai essayé le même code sur 2 machines ubuntu différentes mais l’erreur rest la même. Je ne sais pas pourquoi il essaie d’allouer autant d’octets pour une longueur de 24 + 5.

Quelqu’un pourrait-il me suggérer une solution?

Le code source indique clairement:

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

Donc, je ne suis pas sûr de ce que vous avez fait pour même comstackr quelque chose qui nécessite la taille de struct fp_img : vous n’êtes pas censé pouvoir le faire, car la déclaration de structure est opaque.

On dirait que vous obtenez un pointeur au lieu d’un size_t . Essayez de changer votre définition en:

 API_EXPORTED struct fp_img *fpi_img_new(size_t * length); 

Vous devez ensuite le supprimer:

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

Remarque: il semble que 3077591024 se trouve sur la stack (0x125807FE) et dépend fortement de la plate-forme. Ne me citez pas sur ce point.

Qu’est-ce qui se passe si vous changez

 sizeof(*img) 

avec

 sizeof(struct fp_img) 

? Je pense que cela pourrait être votre problème car * img n’est initialisé à rien au moment où vous appelez g_malloc ().

ERREUR: struct fp_img * img = g_malloc (sizeof (* img) + longueur);

* img est une nouvelle création, vous ne pouvez donc pas l’utiliser comme “sizeof (* img)”, vous pourriez écrire comme ceci: “sizeof (struct fp_img)”