c - 神秘双指针赋值的解释

标签 c pointers

我正在阅读 C 代码:

 void **alignedData = (void **)(((size_t)temp + aligned - 1)&-aligned); 

我不知道方法,尤其是 &- 部分。

谁能解释一下?

谢谢!

最佳答案

使用它时,aligned 应该是无符号类型(或者 C 实现应该使用二进制补码)并且具有一个 2 的幂的值。然后此代码计算要分配的内存量:

  • (size_t) temptemp 转换为无符号类型 size_t,适用于处理大小。这将是要分配的字节数。
  • (size_t) temp + aligned - 1 添加足够的字节以保证 aligned 的倍数落在数字 temp 之间>temp + aligned - 1,包括在内。例如temp为37,aligned为8,则在37和44之间(37+8−1),有8的倍数(40)。
  • -aligned 生成位掩码,每个位位置为 1,是 aligned 的倍数,低位为 0。比如aligned为8,那么代表-aligned的位就是111…111000,因为最后的000位代表1、2、4的值,而其他位表示值 8、16、32 等。
  • (size_t) temp + aligned - 1-aligned&(按位与),然后清除低位,只留下aligned 倍数的位。因此,它会产生区间内 aligned 的倍数。例如,对于前面提到的 37 和 8 的值,((size_t) temp + aligned - 1) & -aligned 产生 40。

因此,此表达式生成 temp 的值,四舍五入为 aligned 的下一个倍数。它说“计算我们需要分配的字节数,它至少是 temp 字节并且是 aligned 的倍数。”

在此之后,代码将此数字转换为类型 void ** 并使用它来初始化 void **alignedData。那是糟糕的 C 代码。通常没有充分的理由。像这样的字节数不应该用作任何类型的指针。该代码可能试图通过其他软件强制使用的数据类型“走私”该值,但可能有更好的方法来做到这一点,例如分配内存来保存该值并提供指向该内存而不是尝试直接转换值。找到更好的解决方案需要了解更多代码上下文。

关于c - 神秘双指针赋值的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66399796/

相关文章:

c++ - 使用 libVLC 作为视频解码器

c++ - 如何使用字符串(字符数组)初始化 char 指针而不是整数数组的 int 指针?

C++ 指针成员初始化

matlab - 如何在 Matlab 中创建指向矩阵的句柄/指针数组?

c++ - 后增量运算符重载中的指针

c - 如何使用与其他 .o 文件一起编译的 .o 文件进行编译 (C99)

c - C 中的这种多管道代码有意义吗?

c - unsigned char 的数组声明

在C中将uint16_t十六进制数转换为十进制数

c++ - 以线程安全的方式返回指针