C语言中的动态内存.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
sbrk系统调用 malloc代码大部分都由库来完成,为什么还要有这个系统调用? 这个系统调用做了什么? 为什么只有内存增加的时候需要系统干预? 现代操作系统的存储机制 free函数的实现 void?free(void?*firstbyte)? { struct?mem_control_block?*mcb; mcb?=?firstbyte?-? sizeof(struct?mem_control_block); ?? mcb-is_available?=?1; /* 这一步是最关键的 */ return; } free机制总结 并不是真正的释放,只是将内存块标记为可用。 问题1:释放内存后,系统显示的可用内存数会发生改变吗? 问题2:释放的内存还可以引用吗? 非常规使用 (1)当申请0个字节时会出现什么情况 例如: int *p; p = (int *)malloc(0); (2)释放一个非动态内存申请的空间 例如: int array[10], *p; p = array; free(p); 两种内存分配的比较 动态分配内存和非动态分配内存的比较 动态分配内存 非动态分配内存 大小在编译时确定 大小在运行时确定 由编译器分配 由操作系统参与分配 分配在数据段和栈内 在堆内 由操作系统自动释放 手动显式释放 memset函数概念 如果需要将一块内存设置为同一个值的时候,需要使用memset函数。 例如: 分配一个缓冲区,将该缓冲区内的值清零 void memset(void *s, int n, size_t size); s:需要设置内存的首地址 n:需要被设置的值 size:需要设置的字节数 memset函数实例 #include stdio.h int main() { char s[10]; memset((void *)s, ‘a’, 10); s[10] = ‘\0’; printf(“%s\n”, s); return 0; } 输出结构为:aaaaaaaaa 使用memset函数和malloc函数实现一个calloc函数 #include stdio.h int main() { char s[10]; memset((void *)s, ‘a’, 10); s[10] = ‘\0’; printf(“%s\n”, s); return 0; } 输出结构为:aaaaaaaaa memcpy函数概念 当需要在两块内存之间进行数据拷贝的时候需要使用memcpy函数 其原形为: void * memcpy(void *dest, const void * src, size_t n); dest:复制到目的地址 src:复制的源地址 n:需要复制的字节数 #include stdio.h int main() { char s[] = “hello”, d[10]; memcpy(d, s, 5); d[5] = ‘\0’; printf(“%s”, d); return 0; } 运行结果:hello 替代函数 void bzero(void *s, size_t n); void bcopy(void * dest, const void * src, size_t n); 其它内存块操作的函数 memccpy(拷贝内存内容) 定义函数 void * memccpy(void *dest, const void * src, int c,size_t n); 函数说明 memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的是,memccpy()会在复制时检查参数c是否出现,若是则返回dest中值为c的下一个字节地址。 返回值为0表示在src所指内存前n个字节中没有值为c的字节。 其它内存块操作的函数 memcmp(比较内存内容) 相关函数 bcmp, 定义函数 int memcmp (const void *s1,const void *s2,size_t n); 函数说明 memcmp()用来比较s1和s2所指的内存区间前n个字符。字符串大小的比较是以ASCII码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先将s1第一个字符值减去s2第一个字符的值,若差为0则再继续比较下个字符,若差值不为0则将差值返回。例如,字符串Ac和ba比较则会返回字符A(65)和b(98)的差值(-33)。 返回值 若参数s1和s2所指的内存内容都完全相同则返回0值。s1若大于s2则返回大于0的值。s1若小于s2则返回小于0

文档评论(0)

kakaxi + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档