malloc用于动态申请内存,这个学过C语言的都知道。忘记了在哪本书上看到,malloc申请的内存不一定是连续,于是一直记住了。这句话有错吗?没有!但是当时只是记住了这个知识点,而没有深入的思考。直到今天,思考一个问题:
char *a=(char *)malloc(10);
*(a+1)与a[1]相等吗?如果malloc分配的内存不连续,这两个就可能不相等了,可是我们在使用的时候,却一直默认它们是相等的,并且也没有出现问题啊。那是不是malloc分配的内存一定是连续的了呢?
对用户而言,所有内存都是虚拟的,也就是说程序并不是直接运行在物理内存上,而是运行在虚拟内存上,然后由虚拟内存转换到物理内存。在对虚拟内存地址到物理内存地址进行转换时,内核会对地址的正确性进行检查,如果地址是合法的,内核就会提供对应的物理内存分页;如果是申请内存空间,内核就会检查空余的物理内存分页,并加以分配,如果物理内存空间不足,内核会拒绝此次申请。使用malloc分配的内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的,因为有可能相邻的两个字节是在不同的物理分页上。
所以,对于应用层程序员来说,是连续的,程序员看到的是虚拟地址空间。如果到物理层,地址就不一定连续了,我们平时在开发程序的时候,都是在虚拟地址空间操作,故,此时我们malloc分配的内存是连续,所以*(a+1)与a[1]在我们使用的时候总是相等的。
误会你那么久,其实也是因为自己当初只是简单的记忆你分配的内存不一定是连续的,就没有再去深究了,如此看来,在学习上刨根问底也是有必要的,知识的深度决定你的高度。
时间: 2024-10-21 17:47:15