我正在创建一个动态内存分配器,我需要检查,而不是当我释放它的一部分时,我传入函数的指针实际上是在该区域内。我有一个指向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}}
答案 0 :(得分:-1)
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