【发布时间】:2015-05-09 00:13:33
【问题描述】:
我有一个 size_t * 变量,我想将其最低有效位设置为 0。由于它从 1 开始,我尝试了以下方法。
size_t * next_chunk = stack_mem.start;
int n = (int)next_chunk;
n ^= 1 << 1;
next_chunk = (size_t)n;
这可能是大错特错。
【问题讨论】:
-
首先,
next_chunk是一个您似乎使用不正确的指针。你可能需要做int n = (int)*next_chunk; -
您为什么要这样做?以这种方式操纵指针值是一件可怕的事情。然后,永远不要通过
int投射指针,这可能会丢失信息。最好的类型是uintptr_t,它保证有必要的宽度,并且因为它是一个无符号类型,所以通常的位操作是明确定义的。 -
从
size_t*到int的转换是非常不安全的,因为指针的大小通常是 4 或 8 字节,而整数的大小通常是 2 或 4 字节(取决于您的平台)。顺便说一句,更糟糕的是,“在回来的路上”,你甚至没有回滚到size_t*,而是回溯到size_t!!! -
@ForceBru:我相信 OP 试图掩盖指针的值,而不是指向数据的值(否则,他为什么要转换为
int而不是size_t?)。
标签: c pointers bit-manipulation