[C和指针] ch11. 动态内存分配

第十一章:动态内存分配

GitHub 链接:ch11. 动态内存分配

非常常用且重要!!!

本章总结及注意点

在这里插入图片描述
在这里插入图片描述


部分课后习题解答

11.10 问题

  1. 取决于系统。可以自己手动声明试一下。

  2. 没理解是啥意思。参考答案:可能有两种解释。请求较小的块可能会允许分配更多的内存,因为最后一次分配后剩余的内存量将更小。这将使较小请求的总数变大。不过,更有可能的是较小的请求越小:这是由于malloc附加到内存的额外空间的开销,以便跟踪每个分配的块的大小。

  3. 最长行长度啊。或者可以分块传输,加上偏移量,不知道可不可。

  4. 优点:函数返回时堆栈中申请的空间将被自动释放,不会造成内存泄露。缺点:无法将要返回的数据存在函数内部申请的局部堆栈空间。

  5. 错了不知道多少…差不多都找出来错误了,详情直接见参考答案吧:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJaGT2Pi-1609154167309)(https://raw.githubusercontent.com/Y-puyu/picture/main/images/20201227152328.png)]

  6. 当然可以。动态内存分配来的空间在堆上,而不在栈上。堆上能申请到的空间要大很多很多,差不多 1G,在 4G 内存下。而栈上的简直少的可怜,貌似 1M?曾经有个面试题还考过能不能申请一个 int[1024][1024] 的局部数组?考察的就是函数栈空间很少造成申请失败。使用标量数据的动态分配只有在其被分配的值大于指针的大小时才有好处,显然对于 4 字节的整数,采用动态分配没有好处,因为必须有指针变量跟踪它所需要的空间和整数本身一样多。

  7. 内存泄露。

11.11 编程练习

  1. 相较于 malloc()calloc() 申请完空间会将其初始化为 0。见 demo01.c

  2. 几个要点:通过 scanf() 的返回值来判断 EOF 即可。增减空间时要把首元素的空间留着,要存储元素值的个数。最后由于已经知道了元素个数,调用 relloc() 函数将后续没用到的空间再缩小回来即可。全程就用 relloc() 的话不需要 free()。见 demo02.c

  3. 按字符读取字符串,写进缓冲区,动态判断读取字符的个数和缓冲区大小,若放不下则选择增容,relloc() 即可。最后由于记录了字符串个数,则直接 malloc() 申请一块刚好的内存将其放入进去即可。注意,'\0' 也要占一个空间!见 demo03.c

  4. 单链表。建议直接去学习 ch12。在这不写了。还有建议 ch11、12、13 这三章有关于内存、指针的一起学习。

随笔

P222, relloc() 函数原型明显出错。返回值应该是 void *,而不仅仅是 void。正确的函数原型:void *realloc(void *ptr, size_t size)

疑问

  1. 我的编译器没有 alloca()

  2. P230 变体记录的动态内存分配版本蛮秀的。 P231 变体记录的销毁优化部分没咋看懂,非这样写不被人淦?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C中,使用指针作为参数传递的方式有一些特点和影响,与Java中直接使用变量作为参数有所不同。 1. 内存操作:使用指针可以直接操作内存,包括修改变量的值、访问数组元素动态分配内存等。这在C中是非常常见的操作,而在Java中则由垃圾回收器自动管理内存,不需要手动操作。 2. 传递引用:在C中,使用指针作为参数传递时,传递的是变量的地址,也就是引用。这意味着在函数内部对指针所指向的内存进行修改,会影响到原始变量的值。而在Java中,传递的是变量的拷贝,函数内部对参数进行修改不会影响原始变量。 3. 空指针和野指针:使用指针作为参数时,需要小心处理空指针和野指针的情况。空指针是指指针没有指向任何有效的内存地址,而野指针是指指针指向未知、无效或已释放的内存地址。在C中,需要手动管理指针的生命周期和内存分配与释放,否则可能导致程序崩溃或内存泄漏。而在Java中,由于有自动内存管理机制,不会出现野指针问题。 4. 字符串操作:在C中,字符串通常以字符指针的形式表示,以'\0'作为字符串的结束标志。使用指针作为参数传递字符串时,可以直接修改字符串的内容。而在Java中,字符串是不可变的,不能直接修改其中的字符,需要通过字符串操作方法来实现。 综上所述,使用指针作为参数传递在C中是常见且必要的,可以灵活地操作内存和实现高效的数据处理。而在Java中,直接使用变量作为参数更安全和方便,由于有自动内存管理和字符串不可变性的特性,不需要像C那样手动处理指针和内存操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值