为验证C++中的编译器内存分配方式而引出的问题
我为了想弄清楚在Qt中为变量分配内存的方式,于是写了下面的简单的程序,创建的项目是Qt4控制台应用程序,Windows下。
#include <QtCore/QCoreApplication>
#include <stdio.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
int i;
int a[5];
int j=0;
for(i=0; i <= 4; i++)
a[i] = 0;
i = 10;
j = 11;
printf(" i 地址:%d,值:%d\n",&i,i);
printf("a[4]地址:%d,值:%d\n",a+4,*(a+4));
printf("a[3]地址:%d,值:%d\n",a+3,*(a+3));
printf("a[2]地址:%d,值:%d\n",a+2,*(a+2));
printf("a[1]地址:%d,值:%d\n",a+1,*(a+1));
printf("a[0]地址:%d,值:%d\n",a,*(a));
printf(" j 地址:%d,值:%d\n\n",&j,j);
printf(" 地址:%d,值:%d\n",a+5,*(a+5));
printf(" 地址:%d,值:%d\n",a-1,*(a-1));
return app.exec();
}
运行的结果是
i 地址:2293540,值:10
a[4]地址:2293536,值:0
a[3]地址:2293532,值:0
a[2]地址:2293528,值:0
a[1]地址:2293524,值:0
a[0]地址:2293520,值:0
j 地址:2293516,值:11
地址:2293540,值:10
地址:2293516,值:11
这里完全没有什么问题,说明Qt中的编译器是按照内存地址递减的方式来给变量分配内存的,接着我写了下面一段代码
#include <QtCore/QCoreApplication>
#include <stdio.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
int i;
int a[5];
int j=0;
for(i=0; i <= 4; i++)
a[i] = 0;
i = 10;
j = 11;
printf(" 地址:%d,值:%d\n",a+5,*(a+5));
printf(" 地址:%d,值:%d\n",a-1,*(a-1));
return app.exec();
}
运行的结果却是
地址:2293536,值:1781959496
地址:2293512,值:0
比较这两个程序,为什么会两个不同的输出结果,第一个程序中多出的几个输出语句对后面的输出语句有什么影响吗?
我还写了一段代码
#include <QtCore/QCoreApplication>
#include <stdio.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
int i;
int a[5];
int j=0;
for(i=0; i <= 5; i++)
*(a+i) = 0;
i = 10;
j = 11;
printf(" 地址:%d,值:%d\n",a+5,*(a+5));
printf(" 地址:%d,值:%d\n",a-1,*(a-1));
return app.exec();
}
第一个程序已经证实了Qt的编译器是按照内存地址递减的方式给变量分配内存的,如果是这样,把循环次数增加一次后,当循环到i=5时,(a+i)指向的应该是存放变量i的内存单元,此时对*(a+i)赋值为0,即i的值变为0,然后会一直循环下去,但是执行的时候为什么没出现死循环的现象,而是把后面的两个输出语句执行后崩溃了,难道是编译器有越界检查,然后做出了相应的处理。各位大侠指点下,小弟不胜感激!