【问题标题】:How do I get the address of the address of a variable (&& is a compiler-error)?如何获取变量地址的地址(&& 是编译器错误)?
【发布时间】:2012-06-12 02:02:18
【问题描述】:

我有一个在网上找不到的快速问题。

我正在使用 CUDA 做一些 GPU 工作,我需要在 GPU 上分配一些数据。 cudaMalloc 函数是这样的:

cudaMalloc(void** identifier, size_t space);

很简单。所以,让我们分配一个整数。

int i = 5;
cudaMalloc((void**)&(&i), sizeof(int));

但是这个错误(“表达式必须是左值或函数指示符”)。明显的解决方法是将i 声明为开头的指针,然后获取它的地址,这非常好;我只是讨厌变通方法。

我觉得这个问题应该有一个明显的答案 - 毕竟,***** 甚至 ********** 在 C 中都可以正常工作。那么,我如何获得变量地址的地址'干净'?

谢谢!

【问题讨论】:

    标签: c pointers cuda


    【解决方案1】:

    不是一种解决方法;这是正确的做法。

    该函数需要指向int 的指针的地址,因为它将将该指针设置为指向它刚刚分配的int。因此,您需要一个真实的已分配指针的地址。像“&&i”这样的表达式要求编译器给你 i 的地址——它是一个纯数字,没有存储位置——然后给你一个指向那个值的指针,当然它不能这样做。

    所以你想说

    int *p;
    cudaMalloc((void**)&p, sizeof(int));
    

    现在*p 是分配的int

    【讨论】:

    • 感谢您的回答。现在我为什么不能这样做是有道理的。
    • 这个答案不正确。您不能将 int ** 转换为 void **。相反,变量p 必须具有void * 类型,以便&p 具有void ** 类型。然后,您可以将p(不是&p)隐式或通过强制转换转换为int *
    • @R..:嗯,你可以int** 转换为void**,它甚至可能“工作”,但它可能是未定义的行为。跨度>
    • 肯定是 UB 只是因为别名违规,但也有可能int *void * 有不同的表示。
    • @R:答案不仅没有错误,而且整个 CUDA 运行时 API 正是基于这种类型的演员。 *p 持有的结果实际上是 另一个内存空间中的地址(GPU),并且在 CUDA 内部完成了各种内部操作,以保证 int * 在主机上的表示GPU 上的 CPU 和 void * 始终相同。
    【解决方案2】:

    无法获取地址的地址。只有 objects 有地址,地址不是对象。您可以将地址分配给指针(这是一个对象),然后获取该指针的地址,这就是您所说的“解决方法”。

    【讨论】:

      【解决方案3】:

      您无法获得对引用的引用,因为&i 没有存储在任何地方,您无法访问它的内存位置,因为它不存在。

      您应该使用指向 int 的指针。

      int *i = calloc(sizeof(int),1);
      

      那么它的引用将是存储在某处的指针变量的地址。当然,如果指针需要在范围外有效,则不能在本地范围内执行此操作,因为您将在堆栈上进行分配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多