通过指针更改值

时间:2015-11-05 18:16:23

标签: c pointers bit-manipulation bitwise-operators bitwise-or

我们有一个看起来像这样的程序:

int TEST = 7;
// Put code here

*((int*) (p + 8)) |= 0x3f;
// TEST should be now 0x3f

您可以看到变量p未声明。我的问题是变量p应该是什么,以便TEST为0x3f?

我已经尝试过了:

int *p = &TEST;

您现在可以使用指针p更改TEST的值,但它似乎不适用于*((int*) (p + 8)) |= 0x3f;

3 个答案:

答案 0 :(得分:1)

指针+整数的指针运算只能在数组对象中完成,否则无效。所以回答你的问题,答案是:无处可去。您无法使用值声明p指针,因此*((int*) (p + 8)) |= 0x3f;将以便携方式修改您的TEST对象。

  

(C99,6.5.6p8)“如果指针操作数和结果都指向元素   相同的数组对象,或者超过数组对象的最后一个元素,评估不应产生溢出;否则,行为未定义。“

答案 1 :(得分:0)

一种可能性是:

uintptr_t p = (uintptr_t)&TEST - 8;

请注意p不是指针,使p指针依赖于实现定义或未定义的行为(取决于你是如何做的),并不是一种可行的方法来获得所需的行为。

答案 2 :(得分:0)

@ kkmah7 - 我想和Grady Player一样:“你究竟想用*((int*) (p + 8)) |= 0x3f完成什么?”

更具体地说,我想知道“(p + 8)”。您是否尝试修改偏移量(p指向的位置)或值(您尝试将“8”添加到“TEST”)。如果是后者,那么“(p + 8”)是错误的。如果是前者,则为undefined behavior

这个例子可能有助于澄清:

#include <stdio.h>

int main(int argc, char *argv[]) {
  int value = 2;
  int *p = &value;

  *p += 2;
  printf ("value= %d, *p= %d\n", value, *p);
  /* Output: value= 4, *p= 4 */

  *p |= 0x3f;
  printf ("value= %d, *p= %d\n", value, *p);
  /* Output: value= 63, *p= 63 */

  return 0;
}