猿问

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

假设有20个内存块,并且指针p指向第一个块。现在,当我这样做时:


p++;

free(p);

多少个内存块将被释放,为什么?


白衣非少年
浏览 544回答 3
3回答

胡子哥哥

不确定的。不能说。您需要提供由返回的确切指针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释放了空间,则该行为是不确定的。

HUH函数

这取决于。您的问题没有提供足够的信息。如果p++导致p引用也由分配的malloc()块,则该块将返回到堆(无论分配了什么大小)。但是,如果它不是指向动态分配的块的指针,则将破坏堆,结果是不确定的,但永远不会好!因此,例如,如果您要这样做:struct sBlock* p = malloc( 20 * sizeof(struct sBlock) ) ;p++ ;        // point to second blockfree( p ) ;  //  Heap corruption or runtime error不需要C运行时来捕获此类错误,但是某些实现或调试环境可能会这样做。通常,在破坏了堆用来跟踪内存的结构之后,尝试分配或释放更多的内存之前,不会注意到该错误。实际的故障模式将是无法预测的,并且通常会在代码接近度和与实际错误的时间上发生一定距离,从而使调试变得困难。
随时随地看视频慕课网APP
我要回答