Je suis en train d'allouer la mémoire avec mmap, voici le code:retours d'allocation mmap 0xfffffffffffffff4 (non MAP_FAILED)
long long *copy;
copy = (long long*)mmap(NULL,
(size_t)1024,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANON, -1, 0);
if (copy == MAP_FAILED) {
fprintf(stderr, "Memory allocation failed (Process aborted)\n");
exit(1);
}
printf("Pointer: %p\n", copy);
Il est évident que je vérifie si l'allocation échoue. Lorsque cela se produit, je devrais obtenir -1 à partir de ce que je rassemble du man pages. La chose est que je reçois -12, bien 0xfffffffffffffff4
, donc l'erreur n'est pas attrapée et le programme continue. Je pensais que c'est peut-être à cause de la distribution (long long*)
, mais une distribution ne devrait pas changer la valeur du pointeur. Je suis donc très curieux de savoir pourquoi cela arrive et comment l'empêcher.
Plus étrange comportement:
J'ai essayé d'imprimer le errno
. Si j'utilise printf("%d\n", errno);
, il imprime 0 et le pointeur est toujours défini sur 0xfffffffffffffff4
. Mais si je l'utilise err(errno, "%p", copy);
il imprime:
program.exe: 0x7f8130981000: Success
Et maintenant, le pointeur est valide, mais je ne peux pas l'utiliser parce que l'exécution err
terminé.
'program.exe' - êtes-vous sur Windows? Utilisez-vous MinGW ou Cygwin ou autre chose? –
Non je peux voir comment cela peut être trompeur, je suis sur linux mais je spécifie l'extension .exe à des fins d'organisation – Hadron
Votre problème pourrait bien être la distribution du retour de 'mmap'. En C, ceci n'est jamais nécessaire et peut cacher des bogues. Peut-être que vous avez oublié de '#include'? Peut-être que vous n'avez pas changé tous les avertissements? '-Wall' pourrait vous en dire plus. –