C语言中内存地址是如何分配的

今天在练习链表的实现,在基于数组的链表中,我的插入函数中的“搬家”代码是这样写的:

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,其他平台上的情况希望朋友来指点指点!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值