我无法更改char指针(数组)

时间:2013-01-31 21:59:42

标签: c++ pointers char

我有这样的功能:

void MClass::GetS(char* buf, int max) const  {
char *temp = new char[max];
temp[max] = '\0';
for (int i = 0; i < max - 1; i++)
    temp[i] = src[i]; // src is class member (char *)
buf = temp; // buf is null after this o.O
}

所以,我无法在此函数中更改buf值。为什么会这样?

4 个答案:

答案 0 :(得分:2)

char *传递给函数会将指针的副本传递给该函数。您可以将其视为通过值传递的指针。修改此复制的指针不会更改原始指针。

您需要通过引用传递它(引用指针):

void MClass::GetS(char *&buf, int max) const

或指针(指向指针的指针):

void MClass::GetS(char **buf, int max) const

或返回指针:

char *MClass::GetS(int max) const

答案 1 :(得分:0)

您正在引用数组之外的元素(因为它具有MAX元素和索引开始且为0)因此UB /错误。 对于空字符顺便说一下,字符数组总是需要1个额外的字符。

有关src的更多信息也会有所帮助。

但是在这种情况下,它会断开你正在改变buf(作为参数)的值而不返回/改变你传入的值。

您需要将指针传递给指针或引用指针(* )或(&amp;)而不仅仅是一个简单的指针。

答案 2 :(得分:0)

问题:

  1. 您正在用temp[max] = '\0';写下堆数组的末尾 - 这会在缓冲区之后放置一个0 1的位置。

  2. 谁知道src有多大。你正在传递一个“最大值”,并在没有检查的情况下读取src 大小 - 非常危险。

  3. 您正在返回带指针的指针。你需要传入一个双指针并获得正确返回的实际指针值(或者在return语句中返回指针。)

  4. 如有疑问,请在调试器中跟踪代码。我的猜测是你的编译器通过优化最后一个分配并将它保留为NULL来帮助你 - 然后让你快速崩溃以后你现在已经损坏的堆和内存泄漏......

答案 3 :(得分:0)

这显然是一个家庭作业问题。

我猜你正在传递一个大小为buf的缓冲区max。你不需要temp,你应该非常小心,不要写下结尾。有点像...

void MClass::GetS(char* buf, int max) const  {
  if(!buf) {
    return;
  }

  for (int i = 0; i < max - 1; i++) {
      buf[i] = src[i]; // How long is `src`?
  }
}

这不是现代的C ++,如果您自己这样做,该函数将被声明为std::string MClass::GetS() const { return src; }(假设srcnull终止)。请更正您的导师。