You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非数组元素的&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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:52:30