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

C++中char*、int*、void*等指针类型的对齐限制相关疑问

C++ 三类指针对齐限制说明

核心逻辑

所有指针的地址合法性限制,完全由它指向的类型的内存对齐(alignment)要求决定:CPU访问内存时,要求n字节大小的基础类型的存储地址必须是n的整数倍,否则会触发访问异常或严重的性能损耗。

三类指针的具体限制

  • char*
    指向的char类型大小为1字节,对齐要求为1,因此地址可以是任意整数,包括奇数值,不存在访问限制。
  • int*
    主流桌面/移动端系统(x86、x86_64、ARM)上int大小为4字节,对齐要求为4,因此int*的地址值必须是4的整数倍,二进制最后两位为0,不能为奇数值。如果强行给int*赋值奇数地址并读写,属于C++标准定义的未定义行为,轻则访问性能暴跌几十倍,重则直接触发硬件异常导致程序崩溃。
  • void*
    属于无类型指针,本身不支持解引用操作,仅用来存储内存地址,因此可以存放任意合法的地址值,没有对齐限制。但如果将void*强转为其他类型的指针,必须满足目标类型的对齐要求,否则会和int*非对齐访问一样触发未定义行为。

常见错误示例

char buf[10] = {0};
// 非法:buf+1的地址不是4的倍数,强转int*后访问会出问题
int* p = reinterpret_cast<int*>(buf + 1);
int val = *p; // 未定义行为

注意:极少数架构(如x86)硬件支持非对齐访问,不会直接崩溃,但这种写法完全不可移植,且性能损失极大,绝对不允许在正式代码中使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:08