linux mmap出现Address 0x7ffff7ff6000 out of bounds>

本文详细解读了使用mmap函数在C语言中进行内存映射的过程,并通过实例展示了如何处理文件大小为0导致的内存映射问题。通过修改代码确保文件大小不为0,避免了出现总线错误的核心转储现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 **mmap.c**
  1 #include <stdio.h>
  2 #include <fcntl.h>
  3 #include <signal.h>
  4 #include <sys/mman.h>
  5 #include <unistd.h>
  6 #define FILESIZE 8192
  7 
  8 int main()
  9 {
 10     int i;
 11     char *p, tmp;
 12     struct stat sb;
 13     int fd = open("1.txt", O_RDWR | O_CREAT, S_IRUSR|S_IWUSR);
 14     p = (char*)mmap(NULL,FILESIZE, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
 15     for (i=0; i<10; i++) {
 16         p[i] = 'a';
 17     }
 18     close(fd);
 19     munmap(p, FILESIZE);
 20     printf("ok\n");
 21     return 0;
 22 }

gcc mmap.c生成执行程序a.out, 运行a.out会出现总线错误 (核心已转储)

(gdb) p p 
$2 = 0x7ffff7ff6000 <Address 0x7ffff7ff6000 out of bounds>

用gdb去调试它会发现line 14映射的地址p有问题,而导致p有问题的原因是因为映射的文件1.txt的大小为0,也就是个空文件,修改方法很简单,让1.txt大小不为0就可以了。

mmap函数原型介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值