【问题标题】:Change value through pointer通过指针改变值
【发布时间】:2015-11-05 18:16:23
【问题描述】:

我们有一个如下所示的程序:

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;

【问题讨论】:

  • 到底是什么*((int*) (p + 8)) |= 0x3f;
  • @GradyPlayer 我猜是声明?
  • 闻起来像学校作业
  • @GradyPlayer 8 被添加到p,结果被转换为“pointer to int”类型,指向的值与0x3F进行位或运算。

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


【解决方案1】:

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

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

【讨论】:

  • @FUZxxl 好吧,标题是 通过指针更改值 所以我的问题解决了p 不能是指针的事实。
  • 问题标题并不暗示p必须是一个指针。如果您将某些内容转换为指针,您会得到一个指针,并且我的回答是通过指针更改值,即使 p 不是指针。
【解决方案2】:

一种可能性是这样的:

uintptr_t p = (uintptr_t)&TEST - 8;

请注意,p 不是此处的指针,使 p 成为指针将依赖于实现定义或未定义的行为(取决于您如何执行),并且不是获得所需行为的可行方法。

【讨论】:

  • 我认为你的意思是 &TEST
  • 您可能需要 p=&TEST-8,但它仍然是未定义的行为
  • 而 p 是一个指针。它被声明为一个并加载了一个地址
  • @Eugene 怎么样?请注意我将&TEST 转换为uintptr_t 以规避未定义的行为。
  • @FUZxxt:你说服了我。我已经删除了反对票。
【解决方案3】:

@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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2020-08-17
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多