检查指针是否在malloc'd区域?

时间:2016-08-26 05:29:14

标签: c pointers malloc

我正在创建一个动态内存分配器,我需要检查,而不是当我释放它的一部分时,我传入函数的指针实际上是在该区域内。我有一个指向malloc'd区域开头的指针

static u_int33_t memory_size;   // number of bytes malloc'd in memory[]
我在启动函数中分配的

。我还有

中存储的malloc'd区域的大小
ptr < *memory || ptr > *memory + memory_size

如何确保ptr不...(伪代码)

void memfree(void *object)
{
   if ( object < memory || object > (memory + memory_size)) {
  fprintf(stderr, "vlad_free: Attempt to free via invalid pointer\n");
  exit(EXIT_FAILURE);
   }
}

并且该代码会导致以下错误;

错误:不同指针类型的比较缺少强制转换[-Werror]     if(object&lt; memory || object&gt;(memory + memory_size))                 ^

我不确定我需要演出什么以及什么不能......

免费功能如下......

{{1}}

1 个答案:

答案 0 :(得分:-1)

原始

Raymond Chen's answer

指出这是错误的
select t.code,
       substring_index(substring_index(t.allvalues, ',', n.n), ',', -1) as vaue
from t cross join
     (select 1 as n union all select 2 union all select 3 union all select 4
     ) n
     on n.n <= length(t.allvalues) - length(replace(t.allvalues, ',', ''));

指针的类型必须相同。鉴于您似乎有一个以字节为单位的范围,最好使用byte。

来自C标准n1570

  

当比较两个指针时,结果取决于中的相对位置   指向的对象的地址空间。如果两个指向对象类型的指针都指向   相同的对象,或两者都指向同一个数组对象的最后一个元素,它们   比较平等。如果指向的对象是同一聚合对象的成员,   稍后声明的结构成员的指针比指向成员的指针要大   在结构中先前声明,并指向具有较大下标的数组元素   值比具有较低下标值的同一数组的元素的指针大。指向同一个union对象的成员的所有指针都比较相等。如果   表达式P指向数组对象的元素,表达式Q指向   同一个数组对象的最后一个元素,指针表达式Q + 1比较大于   P.在所有其他情况下,行为未定义。

在这里,我相信未定义的行为,是你无法判断在2个系统上是否会有一致的排序,所以使用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); } } 的代码在某些系统上可能是真的而在其他

新答案

使用

a < b