【问题标题】:Initialize a pointer with an address value用地址值初始化指针
【发布时间】:2013-12-28 14:43:43
【问题描述】:

我需要用已知地址初始化一个指针变量。请看下面的代码,ptr是最终目的地,ptr_address的值包含地址值,所以我需要做一些类似ptr = value的事情。

int *ptr;
int address;

address = 0x10000005;
ptr = address;

问题是编译器给出了以下警告信息:

warning: assignment makes pointer from integer without a cast [enabled by default]

我的代码是错误的还是有其他方法可以在没有收到此编译器警告的情况下执行此操作?

【问题讨论】:

  • 0x10000005 似乎不太可能是 int 的地址...
  • [OT]:您可以使用std::intptr_t 代替int 来存储您的地址。
  • 请问您在哪种情况下静态(在编译时)知道运行时某些东西的地址?
  • 在初始化过程中,我得到了一组地址值,它们作为简单变量(不是指针)的值传递给我,而在其他时刻,我必须用这些值初始化一个指针。
  • 请注意 C 和 C++ 是不同的语言,请只使用一个或其他标签。在 C 语言中,您可以使用 ptr = (int*) address; 来获取有效代码;甚至ptr = (void*) address; 也可能会起作用。通常,您希望整数指针在四字节边界上对齐 - 这不会。你确定你知道你在做什么吗?指针是危险的东西。当您不知道目标时,切勿瞄准加载的指针。

标签: c++ c pointers


【解决方案1】:

使用演员表:

intptr_t some_variable = 25;

int * ptr1 = (int *) 0x10000005;
int * ptr2 = (int *) some_variable;

或者在 C++ 中:

int * ptr1 = reinterpret_cast<int *>(0x10000005);
int * ptr2 = reinterpret_cast<int *>(some_variable);

【讨论】:

  • 嗨,问题是我不能使用直接值,因为地址是一个变量值,所以我需要使用这个变量。我已经尝试过 ptr = *((int *) ptr_address);但警告是一样的。
  • @user3142113:同样的事情,使用演员表:(int *) ptr_address
  • @user3142113:不,(int*)ptr_address采用ptr_address的地址,它确实采用它的值。跨度>
  • @user3142113 (int*) 是一个演员。它不需要任何地址(这就是 &amp; 运算符的用途)。
  • @user3142113:Kerrek SB 告诉你使用(int *) ptr_address,现在你向我们展示了使用ptr = *((int *) ptr_address); 的代码并抱怨它不起作用。当然它不起作用;这不是您被告知要使用的代码。使用ptr = (int *) ptr_address;
猜你喜欢
  • 2011-10-31
  • 2017-01-30
  • 2018-04-22
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2020-08-23
相关资源
最近更新 更多