C ++指针增量查询

时间:2015-05-21 15:41:31

标签: c++ c function pointers increment

我有一个函数的工作代码,它接受一个字符和一个数字,并通过复制该字符次数来形成一个字符串。这是一件完美无缺的作品。

char * buildstr(char c, int n)
{ 
   char * pc = new char[n+1];
   for (int i = 0; i < n; ++i)
   {
      *(pc+i) = c;
   }

   *(pc+n) = '\0';
   return pc;
}

但是如果我使用另一个直接递增指针本身的逻辑,那么当我使用delete []释放main函数中的内存时会出现错误。

可能是我的问题?

谢谢,

char * buildstr(char c, int n)
{ 
   char * pc = new char[n+1];
   for (int i = 0; i < n; ++i)
   {
      *pc = c;
      pc++;

   }
   *(pc) = '\0';
   return pc;
}

3 个答案:

答案 0 :(得分:7)

问题是你正在返回递增的指针。必须使用由delete[]调用返回的指针值调用new[],否则会得到未定义的行为。这同样适用于free的调用和malloccalloc等返回的指针。

答案 1 :(得分:2)

在第二个示例中,您正在递增指针的值。当您尝试删除它时,它指向数组的最后位置。

这样,当您在其上调用delete[]时,它会崩溃,因为它希望pc指向最初使用new[]分配的地址。

我建议您使用第一种方法,因为您可以在pc的生命周期内跟踪基址。此外,我认为使用数组表示法更容易。

考虑使用:

pc[i] = c;

而不是

*(pc+i) = c;

因为它更惯用且易于阅读。如果您只是在练习指针算术,请坚持使用您描述的第一种方法。

答案 2 :(得分:0)

在第一个函数中,假设你的指针从0x00100开始。 当你进行循环时,你会到达下一个地址,所以例如4循环:

0x00100
0x00101
0x00102
0x00103

但是最后你将指针返回到0x00100,因为你使用索引*(pc+i),其中i是索引,所以很好。

现在在第二个函数上你正在执行相同的exept,你的指针本身没有索引,所以你在最后一个地址返回你的指针

0x00103

这是你的第二个功能不起作用