【问题标题】:How do I get this address?我如何获得这个地址?
【发布时间】:2013-08-04 15:05:35
【问题描述】:

我有这个:

  unsigned int y = (unsigned int)(int*)foo;

如何获取存储在foo 指向的内存值中的地址?

让我们尝试更好地解释,假设它们是 int 类型:

int x = 10;
int *foo = &x;
unsigned int y = (unsigned int)(int*)foo;
int r = MAGIC(y); /* should be 10 */
x = 13; /* r still should be 10 */

y应该是x的地址,即10整数地址。

r 应该复制 y 位置的值,即10 整数。

所以x(如x = 13)的任何更改都不应更改值r。这只是一个 int。

问题是:我如何定义MAGIC

【问题讨论】:

  • 不,这不是问题。问题是,如果您已经拥有foo,为什么还要这样做?使用整数存储地址在某些时候肯定会出错。我的意思是,如果您在一个地址为 64 位且无符号整数仅为 32 位的系统上怎么办?
  • 这就是intptr_t存在的原因。
  • 事实上,我知道这一点......因为我只是在测试它,我没有让所有代码都可移植。还有ptrdiff_t,我以前也用过。

标签: c pointers memory-address


【解决方案1】:

如果你想要的是可能的,那么

#define MAGIC(y) (*((int*)(y)))

会做的。

【讨论】:

    【解决方案2】:

    您的代码试图使用y 作为指针,而实际上它在C 编译器中定义为unsigned integer。在“糟糕的日子”中写回的代码会像你的例子那样做。

    代码的意图应该更加明确和明确,因此:

        #include <stdlib.h>
        main()
    
        {
        int x = 10;
        int *foo = &x;
    
        int *y = foo;
    
            #define MAGIC(A) *A
        int r = MAGIC(y); /* should be 10 */
    
        x = 13; /* r still should be 10 */
    
        printf("x=%d, r=%d", x, r);
            // printed (as expected) :: x=13, r=10
    
         }
    

    现在没有理由使用 C 编译器了!!

    如果您正在维护一些旧代码,其功能类似于您的原始示例,那么使用当今的编程风格重新编写它可能是值得的。请注意,它可以保持用 C 编写,只是格式良好的 C!

    【讨论】:

      【解决方案3】:

      如果 y 要保存 x 的地址,那么它应该声明为:

      unsigned int *y;
      

      MAGIC 应该只是 运算符所指向的内容。

      int r = *y;
      

      MAGIC 只是星号。

      【讨论】:

      • 在“无符号整数”中保存裸地址而不是指针是作者的意图。
      • 无法保证 unsigned int 与指针的长度相同,因此这是一个危险的意图!
      • intptr_t 是整数类型,保证足够大以存储指针。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2022-01-21
      • 2014-05-06
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多