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

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

 p++; free(p); 

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

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

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

根据你的问题,如果malloc() ed指针存储在p ,你执行p++并调用free(p); ,那么p不再是callocmallocrealloc函数返回的指针。

按照章节7.20.3.2, c99标准,第2段

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

一旦使用malloc() calloc()realloc()在堆上分配内存,就会保留一条关于在任何这些调用期间分配的内存量的记录。

因此,如果分配了一些x字节,则该信息由OS单独维护。

喜欢

 ---------------------------- | Pointer | Memory allocated| ---------------------------- 

现在让你在动态内存分配期间使用的指针指向任何位置,即在初始分配期间指向的内存位置以外的某个位置。

但是当你调用free时它并不关心指针指向它的位置它只是查找记录,它获取信息在堆上动态分配了多少内存。

因此free()使用此记录并释放分配的内存,因此您始终需要传递malloc()calloc()realloc()期间使用的指针

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

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

例如,如果你这样做:

 struct sBlock* p = malloc( 20 * sizeof(struct sBlock) ) ; p++ ; // point to second block free( p ) ; // Heap corruption or runtime error 

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