动态结构体数组删元素遇段错误:两种赋值语句的差异解析
动态结构体数组元素删除:两种赋值表达式的差异解析
先明确函数参数的类型本质: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
相关产品推荐
相关产品推荐

