我有一个函数的工作代码,它接受一个字符和一个数字,并通过复制该字符次数来形成一个字符串。这是一件完美无缺的作品。
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;
}
答案 0 :(得分:7)
问题是你正在返回递增的指针。必须使用由delete[]
调用返回的指针值调用new[]
,否则会得到未定义的行为。这同样适用于free
的调用和malloc
,calloc
等返回的指针。
答案 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
这是你的第二个功能不起作用