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]会不会报错?
谢谢!
展开
 我来答
百度网友4760e14
2008-10-16 · TA获得超过164个赞
知道小有建树答主
回答量:265
采纳率:0%
帮助的人:252万
展开全部
首先说明的是,a 不是数组,是一个指针。

int *a=new int[10]; 是用new开辟一个10个int的数组的内存,把头指针赋值给a,所以a可以访问这些数组的数据,int *a=new int;
开辟一个int的内存空间, 至于引用a[100]当然可以,因为a是内存地址的指针,它一般能移动100次,但是它指的地方一般没初始化,所以可能会出现乱码,但是不会报错。
百度网友a80bfc48c
2008-10-16 · TA获得超过342个赞
知道小有建树答主
回答量:378
采纳率:0%
帮助的人:312万
展开全部
int* a代表的是定义一个指针,这个指针指向的是一个int类型,
使用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"数组"的范围内,所以对其赋值可能会导致运行时错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
elfswallow
2008-10-16 · TA获得超过591个赞
知道小有建树答主
回答量:191
采纳率:0%
帮助的人:253万
展开全部
数组a的大小从你编程时内存的安排是1个整数,但是不代表a只能访问这一个整数,事实上a是一个指针,而a[x]的x是这个指针地址的偏移,所以你愿意偏移多少就偏移多少。对于你这种指针方式申明的动态数组,编译器是不会报错的。而如果申明int a[10]的话,你仍然可以a[100]这样用,能够提供数组溢出检查的编译器会报警告,但不会造成编译错误。
但是执行就不一样了。
引用a[100]会不会造成程序出错退出要看运行到a申明时,操作系统为a分配内存的实际情况而定。通常操作系统不会因为你申明一个只有1个整数大小的内存空间,就为你分配这么大的内存,这样效率会很低。所以操作系统会事先在每次用户程序申请内存时分配一块很大的内存,然后让用户慢慢用,这个分配过程一个重要事情就是将这块内存地址空间映射页表制作出来。所以当你访问a[100]时,这个页表要是恰好制作过了那么你就可以访问成功,如果没有制作,这是会产生缺页异常,操作系统会检查出错的原因,发现你访问了你们有申请的内存空间,就会强制杀死你的程序并报错,非法访问,或者在linux中就是segment fault。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式