我的程序是用C语言编写的,使用gcc进行编译。我正在读取一个文件,并将文件内容存储到缓冲区中。为了做到这一点,我需要让缓冲区的大小与文件一样大。我使用malloc()为缓冲区分配内存。不幸的是,我遇到了一个277MB的文件。堆内存是否太小?运行时我得到了一个段错误,但没有更多的信息。它曾经处理过160 MB大的文件,但是这个单独的异常277MB的文件却导致了错误。
编辑:valgrind给了我@0xC0000022L。
编辑:valgrind给了我@0xC0000022L。
==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
的返回值。一个正确的程序可能会耗尽内存,但它永远不会出现段错误。 - Kerrek SBmmap
?此外,为了获得快速到位的分析结果,请在Valgrind下运行程序(调试版本)。 - 0xC0000022Lmalloc
дјҡе°ҶеӨ§еқ—еҶ…еӯҳиҜ·жұӮиҪ¬жҚўдёәеҶ…йғЁзҡ„mmap
и°ғз”ЁгҖӮ - tdenniston