非数组元素的&var +1写法在C语言中的应用场景有哪些?
非数组对象指针+1的合法性与应用场景
从用户chux处得知,对非数组元素的地址执行+1操作是合法的,依据来自C17标准草案6.5.6 ¶7的规定:
对于这些运算符而言,指向非数组对象的指针的行为等同于指向以该对象类型为元素类型、长度为1的数组首元素的指针。
这意味着,即便变量var无法表示为某个数组arr的arr[i](0≤i<n),编写&var +1也是符合标准的。
典型应用场景:一次性分配多对象内存
在SEI CERT C编码标准中,Aaron Ballman提到了“内存局部分配”的用法:通过一次malloc调用为多个对象分配连续内存,核心示例代码如下:
T1 *objptr1 = (T1 *)malloc(sizeof(T1) + sizeof(*objptr2)); *objptr1 = ...; memcpy(objptr1 + 1, objptr2, sizeof(*objptr2));
我也编写了一个可运行的示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { float obj2 = 432.1; long *objptr1 = (long *)malloc(sizeof(*objptr1) + sizeof(obj2)); *objptr1 = 123456789L; memcpy(objptr1 + 1, &obj2, sizeof(obj2)); printf("%ld\n", *objptr1); // 输出123456789 printf("%f\n", *(float *)(objptr1 + 1)); // 输出432.100006 return 0; }
注:该示例假设float的对齐要求小于等于long,Aaron Ballman的原示例使用字符串作为第二个对象(字符串可任意对齐),正确的极简示例可参考对应规范的标准实现。
当然,我们也可以通过char*强制转换结合sizeof实现相同效果:
memcpy((char *)objptr1 + sizeof(*objptr1), &obj2, sizeof(obj2));
通常&var +1比(char*)&var + sizeof var写法更简洁,但这是它唯一的优势吗?请问当var不是数组元素时,&var +1还有哪些应用场景?
内容的提问来源于stack exchange,提问作者Lover of Structure
相关产品推荐
相关产品推荐

