C++指针增量查询

C++指针增量查询,c++,c,function,pointers,increment,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; } 但是如果我使用另一种逻辑,直接递增指针本身,那么当我使用delet

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

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[]释放主函数中的内存时,我会得到一个错误

我有什么问题

谢谢

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;
}

问题是您正在返回递增的指针。delete[]必须使用通过调用new[]返回的指针值来调用,否则会出现未定义的行为。这同样适用于对free的调用以及malloc、calloc等返回的指针。

问题在于返回的是递增的指针。delete[]必须使用通过调用new[]返回的指针值来调用,否则会出现未定义的行为。这同样适用于对free的调用以及malloc、calloc等返回的指针。

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

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

我鼓励您使用第一种方法,因为您将能够在pc的整个生命周期中跟踪基址。此外,我认为使用数组表示法更容易做到这一点

考虑使用:

pc[i] = c;
而不是

*(pc+i) = c;

因为它更地道,更容易阅读。如果您只是在练习指针算法,请坚持您描述的第一种方法。

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

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

我鼓励您使用第一种方法,因为您将能够在pc的整个生命周期中跟踪基址。此外,我认为使用数组表示法更容易做到这一点

考虑使用:

pc[i] = c;
而不是

*(pc+i) = c;

因为它更地道,更容易阅读。如果您只是在练习指针算法,请坚持您描述的第一种方法。

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

0x00100
0x00101
0x00102
0x00103
但在最后,您返回0x00100上的指针,因为您使用了index*pc+i,其中i是索引,所以这很好

现在,在第二个函数中,您正在执行相同的例外,即您正在移动指针本身,而不带索引,因此您将指针返回到最后一个地址

0x00103

也就是说,您的第二个函数不起作用。在第一个函数中,假设您的指针从0x00100开始。 当你进行循环时,你会到达下一个地址,例如,让我们假设4个循环:

0x00100
0x00101
0x00102
0x00103
但在最后,您返回0x00100上的指针,因为您使用了index*pc+i,其中i是索引,所以这很好

现在,在第二个函数中,您正在执行相同的例外,即您正在移动指针本身,而不带索引,因此您将指针返回到最后一个地址

0x00103

也就是说,您的第二个函数不起作用

您返回的是递增的指针,而不是从分配返回的指针。此外,您应该使用等效的、可读性更高的pc[i],而不是像*pc+i这样的表达式,很明显,C++是不需要编写C++中的函数的,除了学习可能的STD::String:它正好做到这一点,另外还有一个大优点:它为你管理内存。Free Free作为参数,使用函数MalC/CaloC/Realc分配的内存块的起始地址。运算符delete期望使用运算符new分配的内存块的起始地址作为操作数。您不能只传递该内存块中的任何地址。我正要在一篇评论中问你,你是否真的不想看到代码中的问题,但是我意识到你认为内存块是某种原子单元的软件。你返回的是递增的指针,而不是从分配中返回的指针。此外,您应该使用等效的、可读性更高的pc[i],而不是像*pc+i这样的表达式,很明显,C++是不需要编写C++中的函数的,除了学习可能的STD::String:它正好做到这一点,另外还有一个大优点:它为你管理内存。Free Free作为参数,使用函数MalC/CaloC/Realc分配的内存块的起始地址。运算符delete期望使用运算符new分配的内存块的起始地址作为操作数。你不能只是通过考试
该内存块中的任何地址。我正要在一篇评论中问你,你是否真的不想看到代码中的问题,但后来我意识到你认为内存块是某种原子单元的软组件。有时候,理解OP的错误概念有点棘手。这其实是一个经典的例子。我正要在评论中问OP他/她是否真的看不到问题,但后来我意识到他/她认为内存块是某种原子单元的软件。也许你应该在你的回答中澄清这个问题,因为我认为OP的困惑正是源于我对这个问题的评论。有时候,理解OP的误解到底在哪里有些棘手。这其实是一个经典的例子。我正要在评论中问OP他/她是否真的看不到问题,但后来我意识到他/她认为内存块是某种原子单元的软件。也许你应该在你的回答中澄清这个问题,因为我认为OP的困惑正是源于此。请看我对这个问题的评论。谢谢。我熟悉数组表示法,第二个函数不是实现这一点的好方法。但我这样做是为了学习,我得到了一个重要的概念,即delete[]希望将相同的地址分配给new。我不知道。谢谢大家的帮助。我熟悉数组表示法,第二个函数不是实现这一点的好方法。但我这样做是为了学习,我得到了一个重要的概念,即delete[]希望将相同的地址分配给new。我不知道。谢谢大家的帮助。