C++ 指针增量查询
C++ Pointer increment query
我有一个函数的工作代码,它接受一个字符和一个数字,并通过将该字符复制一定次数来形成一个字符串。这是一个非常好的作品。
char * buildstr(char c, int n)
{
char * pc = new char[n+1];
for (int i = 0; i < n; ++i)
{
*(pc+i) = c;
}
*(pc+n) = '[=10=]';
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) = '[=11=]';
return pc;
}
问题是您要返回递增的指针。 delete[]
必须使用调用 new[]
返回的指针值来调用,否则会出现未定义的行为。这同样适用于对 free
的调用以及 malloc
、calloc
等返回的指针
在第二个示例中,您正在递增指针的值。当您尝试删除它时,它指向数组的最后一个位置。
这样,当您对其调用 delete[]
时,它会崩溃,因为它希望 pc
指向最初使用 new[]
分配的地址。
我鼓励您使用第一种方法,因为您将能够在 pc
的生命周期内跟踪基地址。此外,我认为使用数组表示法对您来说会更容易。
考虑使用:
pc[i] = c;
而不是
*(pc+i) = c;
因为它更加地道且易于阅读。如果您只是简单地练习指针运算,请坚持您描述的第一种方法。
在第一个函数中,假设您的指针从 0x00100 开始。
当你执行循环时,你会到达下一个地址,例如,让我们说 4 循环:
0x00100
0x00101
0x00102
0x00103
但最后你 return 指针指向 0x00100 因为你使用了索引 *(pc+i)
其中 i
是索引,所以它很好。
现在在第二个函数上你做同样的事情除了你正在移动你的指针本身没有索引所以你return你的指针指向最后一个地址
0x00103
这就是为什么你的第二个函数不起作用
我有一个函数的工作代码,它接受一个字符和一个数字,并通过将该字符复制一定次数来形成一个字符串。这是一个非常好的作品。
char * buildstr(char c, int n)
{
char * pc = new char[n+1];
for (int i = 0; i < n; ++i)
{
*(pc+i) = c;
}
*(pc+n) = '[=10=]';
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) = '[=11=]';
return pc;
}
问题是您要返回递增的指针。 delete[]
必须使用调用 new[]
返回的指针值来调用,否则会出现未定义的行为。这同样适用于对 free
的调用以及 malloc
、calloc
等返回的指针
在第二个示例中,您正在递增指针的值。当您尝试删除它时,它指向数组的最后一个位置。
这样,当您对其调用 delete[]
时,它会崩溃,因为它希望 pc
指向最初使用 new[]
分配的地址。
我鼓励您使用第一种方法,因为您将能够在 pc
的生命周期内跟踪基地址。此外,我认为使用数组表示法对您来说会更容易。
考虑使用:
pc[i] = c;
而不是
*(pc+i) = c;
因为它更加地道且易于阅读。如果您只是简单地练习指针运算,请坚持您描述的第一种方法。
在第一个函数中,假设您的指针从 0x00100 开始。 当你执行循环时,你会到达下一个地址,例如,让我们说 4 循环:
0x00100
0x00101
0x00102
0x00103
但最后你 return 指针指向 0x00100 因为你使用了索引 *(pc+i)
其中 i
是索引,所以它很好。
现在在第二个函数上你做同样的事情除了你正在移动你的指针本身没有索引所以你return你的指针指向最后一个地址
0x00103
这就是为什么你的第二个函数不起作用