Моя программа написана на C, и я компилирую ее с помощью gcc. Я читаю файл и сохраняю содержимое файла в буфер. Для этого мне нужно, чтобы буфер был такого же размера, как файл. Я использую malloc() для выделения памяти для буфера. К сожалению, я столкнулся с файлом размером 277 МБ. Это слишком много для кучи? Я получаю ошибку seg во время выполнения, но не более того. Это работало для файлов размером до 160 МБ, но этот единственный выброс файла размером 277 МБ ломает его.
РЕДАКТИРОВАТЬ: valgrind дает мне
@0xC0000022L valgrind дает мне
==6380== Warning: set address range perms: large range [0x8851028, 0x190e6102) (undefined)
==6380== Warning: set address range perms: large range [0x8851028, 0x190e6028) (defined)
==6380== Warning: set address range perms: large range [0x190e7028, 0x2997c108) (undefined)
==6380== Warning: set address range perms: large range [0x190e7028, 0x2997c028) (defined)
==6380== Warning: silly arg (-1737565464) to malloc()
==6380== Invalid write of size 4
==6380== at 0x8048A49: main (newanalyze.c:85)
==6380== Address 0x4a00 is not stack'd, malloc'd or (recently) free'd
==6380==
==6380==
==6380== Process terminating with default action of signal 11 (SIGSEGV)
==6380== Access not within mapped region at address 0x4A00
==6380== at 0x8048A49: main (newanalyze.c:85)
но в строке 85 это всего лишь небольшая переменная, на которую не должен влиять размер файла.
malloc
. Корректной программе может не хватить памяти, но она никогда не выйдет из строя. - person Kerrek SB   schedule 12.07.2012mmap
для таких случаев? Кроме того, чтобы получить быстрый анализ, запустите программу под Valgrind (отладочная сборка). - person 0xC0000022L   schedule 12.07.2012malloc
переводит большие запросы на выделение вmmap
внутренние вызовы. - person tdenniston   schedule 12.07.2012mmap
уже предоставляет средства для получения указателя на содержимое файла. Так зачем обходить это стороной? - person 0xC0000022L   schedule 12.07.2012