【发布时间】:2015-08-03 09:32:09
【问题描述】:
我有一个函数的工作代码,该函数接受一个字符和一个数字,并通过复制该字符的次数来形成一个字符串。这是一个完美的作品。
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;
}
【问题讨论】:
-
您正在返回递增的指针,而不是从分配中返回的指针。此外,您应该使用等效且更易读的
pc[i],而不是像*(pc+i)这样的表达式。 -
这不应该被标记为C,它显然是C++。
-
请注意,没有必要在 C++ 中编写这样的函数(可能出于学习目的除外),因为
std::stringhas a constructor (see (2)) 正是这样做的(另一个重要优点:它为您管理内存) . -
函数
free期望作为参数起始地址 已使用函数malloc/calloc/realloc分配的内存块。运算符delete期望作为操作数起始地址 已使用运算符new分配的内存块。您不能只在该内存块中传递任何地址。我正要在评论中问你是否真的无法在代码中看到问题,但后来我意识到你认为内存块是一些“原子单元”的软性。
标签: c++ c function pointers increment