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

C++标准是否允许调用std::align传入零大小获取尾后指针?

std::align传0大小参数的行为合法性结论

C++标准明确允许向std::align传入0作为大小参数,你示例中得到尾后指针的行为完全符合标准规定。

标准依据

std::align的函数签名为:

void* align( size_t alignment, size_t size, void*& ptr, size_t& space );

标准中对该函数的行为约定包括:

  • 当size参数为0时,函数调用永远不会失败,直接返回当前的ptr值,且不会修改入参的ptr和space
  • 对齐操作仅要求对齐后的地址满足对齐要求,且对齐后的地址加上请求大小不超过ptr + space即可
  • 地址范围的边界是合法的,也就是说对齐后的地址等于ptr + space的场景(也就是你示例中的尾后指针场景),只要请求大小为0、不需要额外存储空间,就属于合法情况。

示例场景解释

你提供的示例中:

  • 初始start指针指向buffer + 10,可用空间为6字节
  • 请求8字节对齐,最近的满足对齐要求的地址就是buffer + 16,正好等于start + 6(10+6=16),也就是数组的尾后指针
  • 因为请求大小为0,不需要在对齐后的地址之后占用任何存储空间,所以完全满足std::align的成功条件,返回该尾后指针是标准允许的合法行为。

注意尾后指针本身是合法的指针值,只要不进行解引用操作就不会触发未定义行为,该场景下的用法和普通数组的尾后指针用法完全一致。

内容的提问来源于stack exchange,提问作者VainMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:57:04