void *和*(void **)有什么区别?

手提袋

我正在aligned_malloc用C ++编程实现,主要使用以下代码,这些代码可以在Interweb的不同位置找到,包括SO:

void * aligned_malloc(size_t size, int align) {
    if (align < 0) {
        return NULL;
    }

    void *ptr;
    void *p = malloc(size + align - 1 + sizeof(void*));

    if (p != NULL) {
        ptr = (void*) (((ptrdiff_t)p + sizeof(void*) + align -1) & ~(align-1));
        *((void**)((ptrdiff_t)ptr - sizeof(void*))) = p;
        return ptr;
    }
    return NULL;
}

void aligned_free(void *p) {
    void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));
    free(ptr);
    return;
}

我进入*(void**)aligned_malloc我的误会是演员的失误aligned_free由于我们只需要该值,而不必分配给它,为什么不使用

void *ptr = ((void*)((ptrdiff_t)p - sizeof(void*)));

代替

void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));

我以为是一样的,但是当我尝试第一个对齐方式为64时,它给了我一个错误,但是当我尝试第二次强制转换时,程序正常运行了。那么两者之间有什么区别?为了便于阅读,我省略了适当的C ++强制转换。

fredoverflow

让我们简化代码:

int x = 7;
void * p = &x;
void * q = &p;

现在让我们画一个图:

  +---+
x | 7 |
  +---+
    ^ 
    |
  +-|-+
p | * |
  +---+
    ^ 
    |
  +-|-+
q | * |
  +---+

你看到如何pq不平等吗?如果您有q并且想要进入p,则必须取消引用q但是由于void*不能取消引用a,因此您必须向类型系统保证,它将在取消引用之后找到另一个指针,从而将其强制转换void**为取消引用之前的指针

assert(q != p);
assert(*(void**)q == p);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

void()和void {}有什么区别?

来自分类Dev

打字稿中的Never和void有什么区别?

来自分类Dev

(void *)和(void(*)(argument type))强制转换有什么区别?

来自分类Dev

Qt5中的void QSqlQuery :: clear()和void QSqlQuery :: finish()有什么区别?

来自分类Dev

Data.Void.absurd与有什么区别?

来自分类Dev

Java中的void f(Class c)和void f(Class <?> c)之间有什么区别吗?

来自分类Dev

public <T extended Animal> void addAll(List <T>动物)和public void addAll(List <Animal>动物)有什么区别?

来自分类Dev

decltype(void())和decltype(void {})之间的区别

来自分类Dev

void(int)和void(*)(int)之间的区别

来自分类Dev

C ++中void(*)()和void(&)()之间的区别

来自分类Dev

(void)obj和void(obj)之间的区别

来自分类Dev

C#控制台应用程序中的public static void Main()和private static void Main()有什么区别?

来自分类Dev

C#控制台应用程序中的public static void Main()和private static void Main()有什么区别?

来自分类Dev

void proc和带丢弃的void proc之间的区别

来自分类Dev

self.completionBlock = ^ {}和(void)(^ completionBlock)(void)= ^ {}之间的区别

来自分类Dev

decltype(...,void())和void_t之间的区别

来自分类Dev

C ++中void和非void函数之间的区别

来自分类Dev

等待异步Task函数与在void函数内调用await有什么区别?

来自分类Dev

C 中的 main 函数,有 void 和没有 void

来自分类Dev

C:为什么&(void *)和void **不兼容?

来自分类Dev

什么是void []?

来自分类Dev

什么是void(* op)(T&)和void(* op)(T&,void *)?

来自分类Dev

typeof undefined和void之间的JavaScript区别?

来自分类Dev

(void *)指针和&pointer之间的区别?

来自分类Dev

方法的return nil和void之间的区别

来自分类Dev

“ void main”和“ int main”之间的区别

来自分类Dev

为什么func()和func(void)不同

来自分类Dev

“ as?”,“ as!”和“ as”有什么区别?

来自分类Dev

$ *和$ @有什么区别

Related 相关文章

  1. 1

    void()和void {}有什么区别?

  2. 2

    打字稿中的Never和void有什么区别?

  3. 3

    (void *)和(void(*)(argument type))强制转换有什么区别?

  4. 4

    Qt5中的void QSqlQuery :: clear()和void QSqlQuery :: finish()有什么区别?

  5. 5

    Data.Void.absurd与有什么区别?

  6. 6

    Java中的void f(Class c)和void f(Class <?> c)之间有什么区别吗?

  7. 7

    public <T extended Animal> void addAll(List <T>动物)和public void addAll(List <Animal>动物)有什么区别?

  8. 8

    decltype(void())和decltype(void {})之间的区别

  9. 9

    void(int)和void(*)(int)之间的区别

  10. 10

    C ++中void(*)()和void(&)()之间的区别

  11. 11

    (void)obj和void(obj)之间的区别

  12. 12

    C#控制台应用程序中的public static void Main()和private static void Main()有什么区别?

  13. 13

    C#控制台应用程序中的public static void Main()和private static void Main()有什么区别?

  14. 14

    void proc和带丢弃的void proc之间的区别

  15. 15

    self.completionBlock = ^ {}和(void)(^ completionBlock)(void)= ^ {}之间的区别

  16. 16

    decltype(...,void())和void_t之间的区别

  17. 17

    C ++中void和非void函数之间的区别

  18. 18

    等待异步Task函数与在void函数内调用await有什么区别?

  19. 19

    C 中的 main 函数,有 void 和没有 void

  20. 20

    C:为什么&(void *)和void **不兼容?

  21. 21

    什么是void []?

  22. 22

    什么是void(* op)(T&)和void(* op)(T&,void *)?

  23. 23

    typeof undefined和void之间的JavaScript区别?

  24. 24

    (void *)指针和&pointer之间的区别?

  25. 25

    方法的return nil和void之间的区别

  26. 26

    “ void main”和“ int main”之间的区别

  27. 27

    为什么func()和func(void)不同

  28. 28

    “ as?”,“ as!”和“ as”有什么区别?

  29. 29

    $ *和$ @有什么区别

热门标签

归档