C++ Primer 第三版 练习2.4解答

下面的代码段是做什么的有什么严重错误?(注意指针pia 的下标操作符的用法是正确的在3.9.2 节中我们会解释其理由。)
int *pi = new int( 10 );
int *pia = new int[ 10 ];
while ( *pi < 10 ) {
pia[ *pi ] = *pi;
*pi = *pi + 1;
}
delete pi;
delete [] pia;


我来解释一下每行的代码语义:
//动态分配一个int大小的内存空间,其内容初始化为10将其地址存放到pi中
int *pi = new int( 10 );


/动态分配一个能容纳10个int的内存空间,未作初始化操作。
int *pia = new int[ 10 ];


//当*pi(也就是10)小于10的时候,执行循环语句
while ( *pi < 10 ) {

 

//pia[ 10 ] 赋值为10将其开始地址存放到pia中 

pia[ *pi ] = *pi;


 //*pi的内容累加1
*pi = *pi + 1;
}


//释放pi指向的整数内存
delete pi;


//释放pia指向的整数数组内存
delete [] pia;


问题:
1)循环语句条件判断为False,所以循环体中的语句根本不执行。
2) pia[]的index没有经过边界检测,在上例中,pia[]从0~9一共10个int元素,但是*pi的值为10,明显是数组越界访问
3)pia[]中的内容未作初始化处理,里面包含垃圾数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值