malloc、free、多指针,是怎么工作的?

Malloc, free, and multiple pointers, how does it work?

我有多个指针指向动态分配的内存,这些内存是使用单个 malloc 分配的。

int *p1, *p2;
p1 = (int*)malloc(sizeof(int) * 10);
p2 = &p1[5];
free(p2);
p1[5] = 3;
p1[6] = 5;

现在我的问题是 'free(p2)' 语句会做什么?它会在 p1[5] 之前释放内存吗?提前使用内存是否安全 p1[5](即 p1[6], p1[7] , . .)

您无法预测此函数的行为,因为它是未定义的行为

来自参考:

Deallocates the space previously allocated by malloc(), calloc(), aligned_alloc, (since C11) or realloc().

If ptr is a null pointer, the function does nothing.

The behavior is undefined if the value of ptr does not equal a value returned earlier by malloc(), calloc(), realloc(), or aligned_alloc() (since C11).

free, C++ Reference

强调我的:你在这种情况下使用 free 将涉及释放一个指针,该指针不是通过使用任何这些函数获得的;它是通过转换从malloc获得的指针获得的,因此无效。

我对 可能 的最佳猜测是分段错误;但这取决于您的编译器,不是您或我可以保证的。

所以不要这样做。

释放未被 malloc/calloced 的指针是未定义的行为。 某些分配器(例如 glibc)有时可以检测到它并确定性地使程序崩溃并显示 free(): invalid pointer 错误消息,但从技术上讲,如果您这样做,您将失去对程序行为的所有保证。