我试图从一个结构体动态数组中删除一个元素,方法是将每个结构体向左移动,然后将数组重新分配为小一个的大小。
我的问题是:*(p[i])=*(p[i]+1);
和(*p)[i]=(*p)[i+1];
有什么区别,为什么第二个代码可以工作而第一个代码不能工作,导致分段错误。
void rm_event(struct events **p, int index, int qtty){
for(int i=index; i<qtty-1; i++){
*(p[i])=*(p[i]+1); // (*p)[i]=(*p)[i+1];
}
struct events *tmp;
tmp=(struct events*)realloc(*p, sizeof(struct events)*(qtty-1));
if(tmp!=NULL)
*p=tmp;
}
1条答案
按热度按时间qij5mzcb1#
作为
struct **p
,表达式(*p)[i]
首先引用(*p)
,(*p)
是位于数组开头的(struct event *)
,并且[i]
解引用索引i
:相反,
*(p[i])
将遵从p
之后存储的i * sizeof(struct events**)
字节,然后再次遵从*(...)
。这些地址来自同一个运行,顺便说一句,
*p
是通过malloc()
从堆返回的内存地址,而p
是传递参数的堆栈上的地址。这里是memmove的实现,顺便说一句,你应该向调用者报告一个错误,否则他们不知道数组的正确大小。还将
len
参数移到了第一位,以表达p
和len
之间的关系: