今天在练习链表的实现,在基于数组的链表中,我的插入函数中的“搬家”代码是这样写的:
p = &l->elem[l->length-1];
q=&l->elem[i-1];
for(;p>q; p--){
*(p) = *(p-1);
}
后来发现总是把第一个数据被挤出去,经过仔细检查,发现修改成这样是正确的!
p=&(l->elem[l->length-1]);
q = &l->elem[i-1];
//搬家
for(;p >= q; p--){
*(p+1) = *p;
}
仔细捉摸了一番,发现l->elem{}数组中的地址分配是从低到高的!也就是说,搬移数据的时候p p+1 p-1所对应的内存地址的大小是:
p+1 > p > p-1;
所以当p指向数组尾端的时候,*(p) = *(p-1);的作用是把数组的最后一个值赋值成了一个无意义的值。所以造成的插入结果是第一个插入的数据被冲掉了!
这里内存地址是按照下标顺序递增分配的,宿舍里有同学指出32bit,64bit,linux中对内存的分配策略不一样,我的平台是32位windows,其他平台上的情况希望朋友来指点指点!