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,其他平臺上的情況希望朋友來指點指點!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章