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

动态结构体数组删元素遇段错误:两种赋值语句的差异解析

动态结构体数组元素删除:两种赋值表达式的差异解析

先明确函数参数的类型本质:p是struct events **类型,也就是指向结构体数组指针的指针,真正的动态结构体数组首地址是*p指向的内存区域。

正确的写法:(*p)[i] = (*p)[i+1];

*p是指向结构体数组的一级指针,(*p)[i]等价于*((*p) + i),直接定位到数组中第i个struct events元素。这个写法是正确的,因为它访问的是我们通过malloc/realloc分配的有效结构体数组内存,把第i+1个元素的值覆盖到第i个位置,实现元素左移的效果。

错误的写法:*(p[i]) = *(p[i]+1);

p是二级指针,p[i]等价于*(p + i),这相当于把p当成了一个二级指针数组来访问。但实际上p只是一个指向单个一级指针(即指向动态数组的那个指针)的二级指针,并非指针数组。当i >= 1时,p[i]会访问p所在地址往后偏移i * sizeof(struct events*)的内存区域,这部分内存完全是未分配的无效内存,直接解引用p[i](也就是*(p[i]))必然会触发段错误,属于非法内存访问。

简单总结:你要操作的是*p指向的结构体数组,不是p指向的指针数组,所以必须先通过*p拿到数组首指针,再用下标访问元素。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:15:27