免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1777 | 回复: 9
打印 上一主题 下一主题

请教:将内存划分成指定大小的块,标准 c 中有没有这样的函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-01 11:09 |只看该作者 |倒序浏览
我用shmget获取一段共享内存,现在需要把这段空间分成指定大小的块,在 标准 c 函数中,有没有可以完成这种需求的函数?

如果是手工划分,我想就只有先遍历这段内存,再按指定的块大小(如4k)逐一取内存地址,存到一个链表中。不知这种思路是否可行,哪位达人有更好办法请指教。

论坛徽章:
0
2 [报告]
发表于 2010-05-01 11:17 |只看该作者
没有

论坛徽章:
0
3 [报告]
发表于 2010-05-01 11:32 |只看该作者
本帖最后由 没本 于 2010-05-01 11:39 编辑

s[0]到s[15]被切分为16个4096字节的内存块,是连续的。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. int main()
  6. {
  7.         const size_t c = 16;
  8.         const size_t b = 4096;
  9.         char (*s) [4096];
  10.         size_t i;
  11.         s = malloc(b*c);
  12.         for( i=0; i<c; ++i )
  13.                 memset(&s[i], i, b);
  14.         for( i=0; i<c; ++i )
  15.                 printf("%d %d\n", s[i][0], s[i][b-1]);
  16.         assert( (size_t)(s)+b*c-1==(size_t)&(s[c-1][b-1]) );
  17.         free(s);
  18.         return 0;
  19. }
  20. /*
  21. $ gcc aa.c -o aa
  22. $ ./aa
  23. 0 0
  24. 1 1
  25. 2 2
  26. 3 3
  27. 4 4
  28. 5 5
  29. 6 6
  30. 7 7
  31. 8 8
  32. 9 9
  33. 10 10
  34. 11 11
  35. 12 12
  36. 13 13
  37. 14 14
  38. 15 15
  39. $
  40. */
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-05-01 12:00 |只看该作者
本帖最后由 explorewen 于 2010-05-01 12:06 编辑

谢谢prolj和没本的回复,解决了我的疑问。
就是说malloc分配的内存是连续的了,对吧

还有一个问题 : malloc(size)的返回值一定是某页的起初地址吗

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
5 [报告]
发表于 2010-05-01 12:09 |只看该作者
既然知道内存块的大小,直接用指针访问就是了,还划分他做什么

论坛徽章:
0
6 [报告]
发表于 2010-05-01 12:12 |只看该作者
回复 5# A.com

可能是自己防止越界访问的需要

最近正好在写类似的东西

论坛徽章:
0
7 [报告]
发表于 2010-05-01 12:33 |只看该作者
谢谢prolj和没本的回复,解决了我的疑问。
就是说malloc分配的内存是连续的了,对吧

还有一个问题 : m ...
explorewen 发表于 2010-05-01 12:00


是连续的。
    需要页对齐把malloc()换成valloc(),或者用memalign()。

论坛徽章:
0
8 [报告]
发表于 2010-05-01 18:58 |只看该作者
防止越界访问用这个能搞定?

论坛徽章:
0
9 [报告]
发表于 2010-05-02 07:55 |只看该作者
,以前问别人 pad做什么用的,他说可以防止越界。。。

论坛徽章:
0
10 [报告]
发表于 2010-05-02 20:56 |只看该作者
切西瓜吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP