【问题标题】:Implement aligned_malloc using malloc in C [duplicate]在C中使用malloc实现aligned_malloc [重复]
【发布时间】:2023-03-24 11:49:01
【问题描述】:

问题: 为什么我们将p2 声明为void **?为什么不p2*

我们正在返回 p2,但我们的返回函数类型是 void *。这没有任何意义。编译器会说不匹配的返回类型。

void *aligned_malloc(size_t required_bytes, size_t alignment) {
    void *p1;
    void **p2;
    int offset=alignment-1+sizeof(void*);
    p1 = malloc(required_bytes + offset);               // the line you are missing
    p2=(void**)(((size_t)(p1)+offset)&~(alignment-1));  //line 5
    p2[-1]=p1; //line 6
    return p2;
}

【问题讨论】:

标签: c memory alignment malloc


【解决方案1】:

void** 可以隐式转换为void*,所以应该不存在类型问题。

将其声明为void** 的原因是为了方便将分配的指针存储在其前面。

它像这段代码一样工作,它使用另一个变量:

void *aligned_malloc(size_t required_bytes, size_t alignment) {
    void *p1;
    void *p2;
    void **p3;
    int offset=alignment-1+sizeof(void*);
    p1 = malloc(required_bytes + offset);
    p2= (void*)(((size_t)(p1)+offset)&~(alignment-1));
    p3 = (void**) p2; 
    p3[-1]=p1;
    return p2;
}

【讨论】:

  • 所以基本上,void ** 就是让它变成数组。而让它变成数组的原因是因为我们需要存储分配的指针?
猜你喜欢
  • 2017-04-26
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多