C++ 二维动态数组创建及越界问题

目前VS2013不支持动态数组,也就是int a[n], n必须是常量。创建动态数组可以使用 new 的方法。比如创建一个二维动态数组:

int n;
cin>>n;
int **matrix=new int*[n];//matrix是一个存放指向int类型指针的数组,它有n个元素。
for(int k=0;k<n;k++)
{
  matrix[k]=new int[n];//视matrix为一维数组,该语句为matrix的每个元素赋值,每个元素存的是一段内存(用来存放n个int类型的值)的段首地址。
}
在测试这段程序时,输入n为3,那么这个二维数组应该包含9个元素,matrix[i][j]中0<=i<=2, 0<=j<2,现在令matrix[0][18]=100,竟然没有报错。
经调试发现,matrix[0]和matrix[1]这两个元素,所存储地址之差并不是n*sizeof(int),而是远远大于这个数。具体测试代码如下:
#include <iostream>
using namespace std;

int main( )
{
    int n = 4;
    int **matrix = new int*[n];
    for (int k = 0; k < n; k++)
    {
        matrix[k] = new int[n];
    }
    matrix[0][0] = 0;
    matrix[0][14] = 99;
    matrix[0][16] = 100;
    matrix[1][0] = 3;
    cout << "The address of matrix[0][14] is : " << &matrix[0][14] << endl;
    cout << "The address of matrix[0][16] is : " << &matrix[0][16] << endl;
    cout << "The address of matrix[1][0]  is : " << &matrix[1][0] << endl;
    cout << "matrix[0][14] : " << matrix[0][14] << endl;
    cout << "matrix[0][16] : " << matrix[0][18] << endl;
    cout << "matrix[1][0]  : " << matrix[1][0]<<endl;
    return 0;
}

这里写图片描述
从以上运行结果可以看出matrix[0][16]和 matrix[1][0]的地址相同,既然是对同一地址进行存储和读取,则必然会出现错误(matrix[0][16]无法显示100)。
而matrix[0][14]=99,虽然能够正确显示,但是它已经超出了new 分配的内存空间。虽然无法知道为数组分配内存时,为何分配的空间超出代码要求的范围,但是在使用动态数组的时候,一定不要超出数组界限,否则会带来很多不必要的麻烦。
以上为个人看法,有不同意见欢迎指正,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值