鱼C论坛

 找回密码
 立即注册
查看: 1892|回复: 3

[技术交流] 一起来分析一下malloc

[复制链接]
发表于 2016-11-1 16:16:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 阁龙1427 于 2016-11-1 16:17 编辑


这是一个有趣的问题。最近在不经意把0值传给了函数malloc,得到了一个合法的指针之后,才想到这个问题。这就是如下代码,该代码的输出是“Got a valid pointer”。讨论这样的一问题得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。




  1. char *ptr;
  2. if ((ptr = (char *)malloc(0)) ==
  3. NULL)
  4. {
  5. puts("Got a null pointer");
  6. }
  7. else
  8. puts("Got a valid pointer");
复制代码


重赏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-1 16:54:16 | 显示全部楼层
malloc只是返回一个起始地址,所以没有问题。
malloc会找一个长度为size的连续的空间并且分配它,最后返回他的起始地址
传0就是分配一个连续长度为0的内存空间并且返回他的起始地址,也就是没有分配,只是返回起始地址
复制字符串时strcpy/strncpy/wcscpy会接受首地址,然后把字符串的第1个字符放到分配的起始地址,第2个字符串放到分配的起始地址+1,以此类推,直到碰到'\0'或者达到拷贝字符数上限制为止。
现实中不应该这样做,因为那个连续0字节为空的指针可能指向其他数据,进行字符串拷贝会覆盖他们。

点评

我很赞同!: 3.0
我很赞同!: 3
  发表于 2016-11-1 20:25
这也是free失败的原因  发表于 2016-11-1 16:55
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 11:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表