在c ++中访问数组内存会引发错误

时间:2016-06-28 16:51:44

标签: c++ arrays

int** z= new int *[5];
for (int j = 0; j < 8; j ++)
{
    z[j] = new int[5];        
}

for (int n=0; n<8; ++n)
{
    for(int m=0;m<5;++m)
    {
        int  x=n%4;
        int  y=x*wB;
        int p=(*(B+(y+m)));

        z[n][m]=p;            
    }                
}    
return z;    

Bad_Acess_error处抛出n=6,但

int** z= new int *[5];
for (int j = 0; j < 8; j ++)
{
    z[j] = new int[5];        
}

for (int n=0; n<8; ++n)
{
    for(int m=0;m<5;++m)
    {
        int  x=n%4;
        int  y=x*5;
        int p=(*(B+(y+m)));

        z[6][m]=p;            
    }            
return z;               
}

不会抛出任何错误。为什么?这真的很奇怪,我似乎无法理解为什么会这样。我只是输入更多文字,所以它允许我发布这个问题。

修改:用数字替换变量。这些数字只是所讨论数组的限制。我知道第二个代码是有效的,因为输出正是我所期望的那样。

1 个答案:

答案 0 :(得分:1)

简单地说:Buffer Overrun。

int** z= new int *[5];  // Allocates space for 5 slots.

for (int j = 0;
     j < 8;   // <---- *** Assumes space for 8 slots!!!!!
     j ++)
{
    z[j] = new int[5];  // At j==6, access is outside the array.  
}