双指针问题

时间:2011-06-06 22:32:45

标签: c++ pointers breakpoints

任何人都可以告诉我这段代码有什么问题

int* x=new int(5) ;
int i =0;
int** y = new int*[i];
for(int j = 0 ;j<5 ; j++)
{
     y[i++]=x;
}
delete[] y;

当我删除y时,编译器总是触发断点 请注意,我不想删除对象“x” 感谢

5 个答案:

答案 0 :(得分:7)

int i =0;
int** y = new int*[i];

好吧,你刚刚分配了一个指向int的指针数组,其大小足以容纳零元素。在你的循环中你是:

  1. 在数组的边界外写字(记住,零元素......)
  2. 每次迭代增加两次循环计数器。
  3. 从不使用循环变量j
  4. x的值分配给...... y的所有其他元素...如前所述,它超出了数组的范围。
  5. 我真的不知道你要在这里完成什么。多一点背景怎么样?您通过在y的边界之外进行分配来调用未定义的行为,因此在此之后可能发生任何事情。

答案 1 :(得分:2)

初始化'y'时,由于i为0,因此长度为零。

答案 2 :(得分:2)

那一行

int* x=new int(5) ;

你可能意味着

int* x=new int[5]; // square brackets

然后在

int i = 0;
int** y = new int*[i];

你分配0个元素。在lop中你可能意味着迭代j,但每次循环迭代在i上进行两次递增:

for(int j = 0 ;i<5 ; i++)
{
     y[i++]=x;
}

同样在该循环中,您将每个元素设置为指向相同的5个元素数组。我很确定你真的想要这个:

int const M = 5;
int const N = 5;

int** y = new int*[M];
for(int j = 0; j<M ; j++)
{
     y[j] = new int[N];
}

答案 3 :(得分:1)

y是零长度,因为初始化时我= = 0 所以断点就是你在第二个循环中访问y [1]。 但这就是为什么增加两倍我?

答案 4 :(得分:-1)

试试这个:

int len = 5;
int* x=new int[len] ;
int** y = new int*[len];
int i =0;
for(int j = 0 ;j<len ; j++)
{
     y[i++]=x;
}
delete[] y;

除非为其声明别名变量,否则不应在代码中使用常量。