检查指针是否在malloc’d区域?
我正在制作一个动态内存分配器,我需要检查,而不是当我释放它的一部分时,我传入函数的指针实际上是在该区域内。 我有一个指向malloc’d区域开头的指针
typedef unsigned char byte; static byte *memory // pointer to start of allocator memory
我在启动函数中分配的。 我也存储了malloc’d区域的大小
static u_int33_t memory_size; // number of bytes malloc'd in memory[]
我如何确保ptr不…(伪代码)
ptr *memory + memory_size
并且该代码导致以下错误;
错误:不同指针类型的比较缺少强制转换[-Werror] if(object (memory + memory_size))^
我不确定我需要投出什么以及什么不…
免费function如下……
void memfree(void *object) { if ( object (memory + memory_size)) { fprintf(stderr, "vlad_free: Attempt to free via invalid pointer\n"); exit(EXIT_FAILURE); } }
原版的
如Raymond Chen所说,这是错误的
void memfree(void *_object) { byte* object = (byte*)_object; if ( object >= memory && object < (memory + memory_size)) { /* defined guarantees - they happened to be in the same object. */ } else { fprintf(stderr, "memfree: Attempt to free via invalid pointer\n"); exit(EXIT_FAILURE); } }
指针的类型必须相同。 鉴于您似乎有一个以字节为单位的范围,最好使用byte。
从C标准n1570
比较两个指针时,结果取决于指向的对象的地址空间中的相对位置。 如果两个指向对象类型的指针都指向同一个对象,或者两个指针都指向同一个数组对象的最后一个元素,则它们相等。 如果指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针比指向结构中先前声明的成员的指针大,指向具有较大下标值的数组元素的指针比指向同一数组的元素的指针大。具有较低的下标值。 指向同一union对象成员的所有指针都比较相等。 如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比较大于P.在所有其他情况下,行为是未定义的。
在这里,我相信未定义的行为,是你无法判断在2个系统上是否存在一致的排序,因此使用a < b
代码在某些系统上可能是真的而在其他系统上可能是假的。
新答案
使用
void memfree(void *_object) { uintptr_t object = (uintptr_t)_object; if ( object >= (uintptr_t)memory && object < ((uintptr_t)memory + (uintptr_t)memory_size)) { /* defined guarantees - they happened to be in the same object. */ } else { fprintf(stderr, "memfree: Attempt to free via invalid pointer\n"); exit(EXIT_FAILURE); } }