C++中,new申请内存问题?

来源:百度知道 编辑:UC知道 时间:2024/07/01 07:43:40
语句是这样的:
int *a=new int[10];
如果程序是这样,数组a的大小是10个元素;
如果程序改为:
int *a=new int;
这样数组a大小是多大,上面的语句有问题吗?如果引用a[100]会不会报错?
谢谢!

首先说明的是,a 不是数组,是一个指针。

int *a=new int[10]; 是用new开辟一个10个int的数组的内存,把头指针赋值给a,所以a可以访问这些数组的数据,int *a=new int;
开辟一个int的内存空间, 至于引用a[100]当然可以,因为a是内存地址的指针,它一般能移动100次,但是它指的地方一般没初始化,所以可能会出现乱码,但是不会报错。

int *a=new int;

这样,a的长度就是一个int类型的变量空间。即只有一个元素。在这种情况下,引用 a[100]也是可行的,不会报错.不过,a[100]不在a"数组"的范围内,所以对其赋值可能会导致运行时错误。

int* a代表的是定义一个指针,这个指针指向的是一个int类型,
使用new的时候是表示在堆上开辟内存空间,
你第一个中new int[10] 这里的10代表个数,这里表示,开辟一个可以容纳10个int的内存空间,
而下面这个只开辟一个,
这里你使用的是指针的方式访问数据,即使是上面中你可只能
*a=1; *(a+1)=2;

你说这种情况一般编译器不会提示但是由于访问一个未知的内存就可能造成不确定的后果

数组a的大小从你编程时内存的安排是1个整数,但是不代表a只能访问这一个整数,事实上a是一个指针,而a[x]的x是这个指针地址的偏移,所以你愿意偏移多少就偏移多少。对于你这种指针方式申明的动态数组,编译器是不会报错的。而如果申明int a[10]的话,你仍然可以a[100]这样用,能够提供数组溢出检查的编译器会报警告,但不会造成编译错误。
但是执行就不一样了。
引用a[100]会不会造成程序出错退出要看运行到a申明时,操作系统为a分配内存的实际情况而定。通常操作系统不会因为你申明一个只有1个整数大小的内存空间,就为你分配这么大的内存,这样效率会很低。所以操作系统会事先在每次用户程序申请内存时分配一块很大的内存,然后让用户慢慢用,这个分配过程一个重要事情就是将这块内存地址空间映射页表制作出来。所以当你访问a[100]时,这个页表要是恰好制作过了那么你就可以访问成功