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

来源:互联网 发布:赞美女生的网络句子 编辑:程序博客网 时间:2024/06/06 17:08

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

我们都知道,在使用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下的运行结果是:


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


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

我们先看看这个语句吧、

printf("%c\n", ch2[-4]);
是不是从没见过这样的写法?书上教的很老师讲的估计都没有提及这个。

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

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

好,我们说下为什么是这样的结果,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不同平台分配内存方式不同。并且发现个数组的神奇用法(编程不要用!)玩玩而已~~~就到这里了





原创粉丝点击