
ID:技術讓夢想更偉大
作者:李肖遙
我們在寫程序中經常會用到malloc函數進行動態內存分配,但是我們有沒有想過,在C語言中,向操作系統請求malloc內存空間的地址是連續的嗎???
我使用的是win7+32位操作系統(是不是太low了,對,就是10年買的電腦),下面我們從不同申請的方式來測,從而看看申請的是否連續地址。
#include "stdio.h"
#include "stdlib.h"
int main()
{
void *addr0 = malloc(0);
void *addr1 = malloc(1);
void *addr2 = malloc(2);
printf("%p\n",addr0 );
printf("%p\n", addr1);
printf("%p\n", addr2);
printf("%ld\n", addr1 - addr0);
printf("%ld\n", addr2 - addr1);
free(addr0);
free(addr1);
free(addr2);
return 0;
}
測試結果如下
感覺像是有個固定的間隔,這里測試結果間隔是0x20,但地址并不是連續地址,具體為什么后面我們會講到。
#include "stdio.h"
#include "stdlib.h"
int main()
{
int* p;
int i;
p = (int *)malloc(10*sizeof(int));
for (i = 0; i < 10; i++)
{
p[i] = i;
printf("%d----%p\n", p[i],&p[i]);
}
getchar();
return 0;
}
結果如下:
可以看出,用一次malloc申請多個(數組)地址的是連續地址 ,結果也應證了。
#include "stdio.h"
#include "stdlib.h"
int main()
{
int* p;
int i;
for (i = 0; i < 1000; i++)//10、100、1000測試
{
p = (int*)malloc(sizeof(int));
*p = i;
printf("%d-----%p----%p\n", *p, p, p-1);
}
getchar();
return 0;
}
循環10次結果如下
循環100次結果如下
循環1000次結果如下
(p-1)作比較發現,地址并不是連續的。
其實這就是內存邊界對齊的問題,使用malloc分配的內存空間在虛擬地址空間上是連續的,但是轉換到物理內存空間上有可能是不連續的,
對用戶而言,所有內存都是虛擬的,程序并不是直接運行在物理內存上,而是運行在虛擬內存上,然后由虛擬內存轉換到物理內存。
虛擬內存地址到物理內存地址進行轉換時,因為有可能相鄰的兩個字節是在不同的物理分頁上,所以不一定是連續的。
本篇主要是想拋磚引玉,大家可以在自己電腦測試一下,后期會細節講到字節對齊原則及作用,malloc的原理和內存分配,內存分頁等問題。
推薦閱讀:
嵌入式編程專輯
Linux 學習專輯
C/C++編程專輯
關注
微信公眾號『技術讓夢想更偉大』,后臺回復“m”查看更多內容,回復“
加群
”加入技術交流群。

長按前往圖中包含的公眾號關注