C++中,new申请内存问题?
语句是这样的:int*a=newint[10];如果程序是这样,数组a的大小是10个元素;如果程序改为:int*a=newint;这样数组a大小是多大,上面的语句有问题吗...
语句是这样的:
int *a=new int[10];
如果程序是这样,数组a的大小是10个元素;
如果程序改为:
int *a=new int;
这样数组a大小是多大,上面的语句有问题吗?如果引用a[100]会不会报错?
谢谢! 展开
int *a=new int[10];
如果程序是这样,数组a的大小是10个元素;
如果程序改为:
int *a=new int;
这样数组a大小是多大,上面的语句有问题吗?如果引用a[100]会不会报错?
谢谢! 展开
4个回答
展开全部
int* a代表的是定义一个指针,这个指针指向的是一个int类型,
使用new的时候是表示在堆上开辟内存空间,
你第一个中new int[10] 这里的10代表个数,这里表示,开辟一个可以容纳10个int的内存空间,
而下面这个只开辟一个,
这里你使用的是指针的方式访问数据,即使是上面中你可只能
*a=1; *(a+1)=2;
你说这种情况一般编译器不会提示但是由于访问一个未知的内存就可能造成不确定的后果
使用new的时候是表示在堆上开辟内存空间,
你第一个中new int[10] 这里的10代表个数,这里表示,开辟一个可以容纳10个int的内存空间,
而下面这个只开辟一个,
这里你使用的是指针的方式访问数据,即使是上面中你可只能
*a=1; *(a+1)=2;
你说这种情况一般编译器不会提示但是由于访问一个未知的内存就可能造成不确定的后果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2008-10-16
展开全部
int *a=new int;
这样,a的长度就是一个int类型的变量空间。即只有一个元素。在这种情况下,引用 a[100]也是可行的,不会报错.不过,a[100]不在a"数组"的范围内,所以对其赋值可能会导致运行时错误。
这样,a的长度就是一个int类型的变量空间。即只有一个元素。在这种情况下,引用 a[100]也是可行的,不会报错.不过,a[100]不在a"数组"的范围内,所以对其赋值可能会导致运行时错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数组a的大小从你编程时内存的安排是1个整数,但是不代表a只能访问这一个整数,事实上a是一个指针,而a[x]的x是这个指针地址的偏移,所以你愿意偏移多少就偏移多少。对于你这种指针方式申明的动态数组,编译器是不会报错的。而如果申明int a[10]的话,你仍然可以a[100]这样用,能够提供数组溢出检查的编译器会报警告,但不会造成编译错误。
但是执行就不一样了。
引用a[100]会不会造成程序出错退出要看运行到a申明时,操作系统为a分配内存的实际情况而定。通常操作系统不会因为你申明一个只有1个整数大小的内存空间,就为你分配这么大的内存,这样效率会很低。所以操作系统会事先在每次用户程序申请内存时分配一块很大的内存,然后让用户慢慢用,这个分配过程一个重要事情就是将这块内存地址空间映射页表制作出来。所以当你访问a[100]时,这个页表要是恰好制作过了那么你就可以访问成功,如果没有制作,这是会产生缺页异常,操作系统会检查出错的原因,发现你访问了你们有申请的内存空间,就会强制杀死你的程序并报错,非法访问,或者在linux中就是segment fault。
但是执行就不一样了。
引用a[100]会不会造成程序出错退出要看运行到a申明时,操作系统为a分配内存的实际情况而定。通常操作系统不会因为你申明一个只有1个整数大小的内存空间,就为你分配这么大的内存,这样效率会很低。所以操作系统会事先在每次用户程序申请内存时分配一块很大的内存,然后让用户慢慢用,这个分配过程一个重要事情就是将这块内存地址空间映射页表制作出来。所以当你访问a[100]时,这个页表要是恰好制作过了那么你就可以访问成功,如果没有制作,这是会产生缺页异常,操作系统会检查出错的原因,发现你访问了你们有申请的内存空间,就会强制杀死你的程序并报错,非法访问,或者在linux中就是segment fault。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询