红联Linux门户
Linux帮助

浅谈windows和linux下内存分配规律

发布时间:2016-03-15 15:13:56来源:linux网站作者:odaynot

首先先说明下,本文中代码来自牛刀教程。写的很不错。给我不少的启发。谢谢了。

我们都知道,在使用C语言时,比如定义一个数组,一个变量。那么系统都会随机的分配内存。那么你知道内存分配的规律吗?

让我们用两个实验来说明windows和linux下,内存分配方式的不同。


同一个程序(如下)

#include <stdio.h> 
int main() 

char ch1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}; 
char ch2[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'}; 
char ch3[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
printf("%c\n", ch2[-4]);   //请先无视这样的写法 
printf("%s\n", ch1); 
printf("%s\n", ch2); 
printf("%s\n", ch3); 
return 0;


我们在windows下的运行结果是:

浅谈windows和linux下内存分配规律

而在linux下运行结果是这样的:

浅谈windows和linux下内存分配规律

截然不同。这是为什么呢?


我们先看看这个语句吧:

printf("%c\n", ch2[-4]); 

是不是从没见过这样的写法?书上教的很老师讲的估计都没有提及这个。


如果超出数组范围,那么就是溢出了,按理说是垃圾数据,不过似乎不总是。我们获取的数据都是我们定义的。

看我的程序,虽然有些警告,但是都运行出来了。(windows下用的CB,linux下用的GCC)

好,我们说下为什么是这样的结果,windows是从高地址向低地址分配额空闲空间的。

而linux是从低地址向高地址分配空闲内存的。

如图:

浅谈windows和linux下内存分配规律


在windows下,如图所示。我们输出ch2[-4]为‘6’因为这块内存是连续的。ch2[0]=‘a’。那么ch2[-1]=‘9’。ch2[-2]=‘8’。ch2[-3]='7'。 ch2[-4]自然等于‘6’。

而linux下,如图所示,推算为‘G’。

仔细看代码,做输出实验,我们就会进一步的理解程序在运行时的内存使用。对未来的学习会有很大的帮助。

真正的理解数组,才能有效的避免错误的使用数组。增加程序的安全性。并且我们知道程序在运行中数据本不能受到有效的保护。极易受到别有用心之人的利用。


其实还是有很多不理解的。不是说会自动加‘\0’的吗?实验结果来看好像不是这样。

三个数组都是连续的。但是最后的数组为什么又停下来,没有继续输出垃圾数据呢?有点小奇怪。有空再做实践验证吧。

还有windows里面输出的那两个字符是怎么回事?还有待进一步的学习。本文就是简单的说明下win和lin不同平台分配内存方式不同。并且发现个数组的神奇用法(编程不要用!)


本文永久更新地址:http://www.linuxdiyf.com/linux/18955.html