无效 ** 等同于无效 * 返回
void ** equivalent to void * return?
void * alligned_malloc(size_t bytes , uint16_t allign)
{
uint16_t offset = allign - 1 + sizeof(void*);
void* p1 = malloc(offset + bytes);
void**p2 = (void**)(((size_t)p1+offset) & ~(allign - 1));
p2[-1] = p1;
return p2; // Why is this correct ? should not the return be p2[0] as it is returning void**
}
请帮助我理解这个修改后的 malloc 在此代码中 void** 如何等同于 void * 返回?
任何类型的
指针都可以隐式转换为void *
,包括指向void *
的指针,又名void **
。
void*
可以指向任何内容,包括另一个指针。
void**
如何等同于此代码中的void *
返回?
任何指针类型都可以转换为 void*
。
返回不应该是 p2[0],因为它返回无效**
不。 p2
是对齐内存的地址,因此这是函数应返回的内容。在函数中,它被重新解释为void**
,以便在对齐的内存之前存储原始地址;据推测,这是由释放内存的相应函数读回的。在函数之外,它不会被解释为指向任何特定类型 - 由调用方决定使用对齐内存的目的。
你可以返回它。但我怀疑它是否按预期工作。
至少,你不能简单地free()
它;你必须有一个单独的功能。
但是,然后它将起作用。
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 枚举进程模块在有效句柄上返回无效句柄
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- 自动返回类型匹配无效
- Gmock:返回无效值
- 具有引用返回类型的重写方法上的协变返回类型无效
- cppcheck 抱怨危险地使用 c_str(). c_str() 返回的值在此调用后无效
- cpp 检查抱怨危险使用 c_str(). c_str() 返回的值在本次调用后无效,如何解决?
- 对"无效的抽象返回类型"进行故障排除
- C++ 安全数组在从 c# COM dll 返回时具有无效数据
- 访问冲突投射到无效*并返回
- 将uint64_t转换为无效*并返回
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 从模板函数返回默认构造或无效
- get 函数返回无效值
- 错误:二进制表达式('float' 和 'float')返回的无效操作数 (x & (1 << 31)) == 0
- 发布信号量返回错误 6(无效句柄)
- 获取控制权到达非无效函数警告的末尾,尽管我在 th 函数中有返回语句
- 无效 ** 等同于无效 * 返回