下面的代码段是做什么的有什么严重错误?(注意指针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[]中的内容未作初始化处理,里面包含垃圾数据。