像(void**)&device 您所在的位置:网站首页 void返回值 像(void**)&device

像(void**)&device

#像(void**)&device| 来源: 网络整理| 查看: 265

问题是void*在C中有一个特殊的含义,有特殊的规则(1)。它是唯一可以安全转换任何其他指针类型的指针类型。但是,这些特殊规则并不递归地应用于void**。

意味着像int* ptr = malloc(x);这样的代码是非常好的,但是

int* ptr; cudaMalloc(&ptr, x); // bad

不太好!从int**到void**的指针转换没有很好地定义.从理论上讲,这可能导致未定义的行为和失调(2)。

此外,指针混叠也可能存在问题。编译器可以自由地假设void*的内容从未通过int**访问,因此可以以意想不到的方式优化代码,从而导致违反严格混叠规则(6.5)的未定义行为。

这意味着为了安全地使用该函数,您必须编写这样的代码:

void* vptr; int* iptr; cudaMalloc(&vptr, x); iptr = vptr;

(1) C11 6.3.2.3/1:

指向空的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针可以再次转换为无效指针和返回指针;结果应与原始指针相比较。

(2) C11 6.3.2.3/7:

指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未针对引用类型正确对齐,则行为未定义。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有