为了账号安全,请及时绑定邮箱和手机立即绑定

如果在C中更改指针,将释放多少内存?

如果在C中更改指针,将释放多少内存?

C
白衣非少年 2019-10-22 22:42:53
假设有20个内存块,并且指针p指向第一个块。现在,当我这样做时:p++;free(p);多少个内存块将被释放,为什么?
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

不确定的。不能说。您需要提供由返回的确切指针malloc()。


传递[和family] free()不返回的指针malloc()是未定义的行为。


根据你的问题,如果malloc()-ed指针存储在p了,你p++和打电话free(p);,那么就p没有了指针由归国的calloc,malloc或realloc功能。


根据7.20.3.2章,c99标准,第二段


free函数使ptr指向的空间被释放,即可以用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与calloc,malloc或realloc函数先前返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则该行为是不确定的。


查看完整回答
反对 回复 2019-10-22
?
HUH函数

TA贡献1836条经验 获得超4个赞

这取决于。您的问题没有提供足够的信息。


如果p++导致p引用也由分配的malloc()块,则该块将返回到堆(无论分配了什么大小)。但是,如果它不是指向动态分配的块的指针,则将破坏堆,结果是不确定的,但永远不会好!


因此,例如,如果您要这样做:


struct sBlock* p = malloc( 20 * sizeof(struct sBlock) ) ;

p++ ;        // point to second block

free( p ) ;  //  Heap corruption or runtime error

不需要C运行时来捕获此类错误,但是某些实现或调试环境可能会这样做。通常,在破坏了堆用来跟踪内存的结构之后,尝试分配或释放更多的内存之前,不会注意到该错误。实际的故障模式将是无法预测的,并且通常会在代码接近度和与实际错误的时间上发生一定距离,从而使调试变得困难。


查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 543 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信