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

C语言指针算术疑问:为何Node*强转为char*加sizeof(Node)才能正常赋值next

问题核心原因

核心是你混淆了指针本身的存储大小和C语言指针算术的偏移规则两个完全独立的概念,和char*、Node*本身占多少字节没有任何关系。


指针加法的运算规则

C语言对指针类型的加减法做了封装,偏移量会自动乘以指针指向类型的大小:

  • 对T*类型的指针来说,指针 + N等价于(T*)((char*)指针 + N * sizeof(T)),偏移的基本单位是sizeof(T)字节,而不是1字节。

结合你的代码计算差异

你的Node结构体包含1个int和2个指针,32位系统下sizeof(Node)为12字节:

  1. 当你执行current->next = (char*) current + sizeof(Node)时:
    char*指向的类型大小是1字节,所以实际偏移字节数为12 * 1 = 12,刚好跳过当前Node的大小,指向连续内存里的下一个Node节点,逻辑符合预期。
  2. 当你执行current->next = current + sizeof(Node)时:
    current是Node*类型,指向的类型大小是12字节,所以实际偏移字节数为12 * 12 = 144,远超过你需要的下一个节点位置,会直接访问到你申请的堆内存之外的区域,自然运行异常。

补充说明

如果你不想强转char*,也可以直接写current->next = current + 1,效果和强转的写法完全等价,也能正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 02:27:04