指针增量查询

C++ Pointer increment query

本文关键字:查询 指针      更新时间:2023-10-16

我有一个函数的工作代码,它接受一个字符和一个数字,并通过复制该字符的次数形成字符串。

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

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

我的问题是什么?

谢谢,

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

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

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

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

我建议您使用第一种方法,因为您将能够在pc的整个生命周期中跟踪基址。此外,我认为使用数组表示法对您来说更容易。

考虑使用:

pc[i] = c;
不是

*(pc+i) = c;

因为它更习惯,更容易阅读。如果您只是简单地使用指针运算,请坚持使用前面描述的第一种方法。

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

0x00100
0x00101
0x00102
0x00103

但是在结束时,您返回0x00100上的指针,因为您使用了索引*(pc+i),其中i是索引,所以它是好的。

现在在第二个函数中,你做了同样的事情,除了你移动指针本身没有索引所以你返回指针在最后一个地址

0x00103

这就是为什么你的第二个函数不起作用