指针增量查询
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) = ' ';
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
和由malloc
、calloc
等返回的指针。
在第二个示例中,您正在增加指针的值。当您试图删除它时,它指向数组的最后一个位置。
这样,当你调用delete[]
时,它会崩溃,因为它期望pc
指向最初使用new[]
分配的地址。
我建议您使用第一种方法,因为您将能够在pc
的整个生命周期中跟踪基址。此外,我认为使用数组表示法对您来说更容易。
考虑使用:
pc[i] = c;
不是
*(pc+i) = c;
因为它更习惯,更容易阅读。如果您只是简单地使用指针运算,请坚持使用前面描述的第一种方法。
在第一个函数中,假设您的指针从0x00100开始。当你进行循环时你会到达下一个地址例如我们输入4 loop:
0x00100
0x00101
0x00102
0x00103
但是在结束时,您返回0x00100上的指针,因为您使用了索引*(pc+i)
,其中i
是索引,所以它是好的。
现在在第二个函数中,你做了同样的事情,除了你移动指针本身没有索引所以你返回指针在最后一个地址
0x00103
这就是为什么你的第二个函数不起作用
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 查询SQLite数据库中的日期
- 数组的指针从不分段故障
- 我可以查询是否是动态分配数组中的第一个指针
- 有关C++中的指针的查询
- C++指针查询
- 基于指针的查询
- 来自新手用户的共享指针查询.我下面的代码在使用带有成员共享指针的类容器时崩溃
- 指针基础:一个简单的查询
- 如何向上查询或向下查询接口指针
- C++指针查询
- 查询指针解引用
- 指针增量查询