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字节:
- 当你执行
current->next = (char*) current + sizeof(Node)时:char*指向的类型大小是1字节,所以实际偏移字节数为12 * 1 = 12,刚好跳过当前Node的大小,指向连续内存里的下一个Node节点,逻辑符合预期。 - 当你执行
current->next = current + sizeof(Node)时:current是Node*类型,指向的类型大小是12字节,所以实际偏移字节数为12 * 12 = 144,远超过你需要的下一个节点位置,会直接访问到你申请的堆内存之外的区域,自然运行异常。
补充说明
如果你不想强转char*,也可以直接写current->next = current + 1,效果和强转的写法完全等价,也能正常运行。
内容的提问来源于stack exchange,提问作者user5369
相关产品推荐
相关产品推荐

