-2

我有一些这样的功能:

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

4 回答 4

3

传递char *给函数会传递指向该函数的指针的副本。您可以将其视为按值传递的指针。修改这个复制的指针不会改变原始指针。

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

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

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

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

或返回指针:

char *MClass::GetS(int max) const
于 2013-01-31T22:06:04.147 回答
0

问题:

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

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

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

如有疑问,请在调试器中跟踪您的代码。我的猜测是,您的编译器正在通过优化最后一个分配并将其保留为 NULL 来帮助您 - 然后让您稍后因现在损坏的堆和内存泄漏而愉快地崩溃......

于 2013-01-31T22:10:50.310 回答
0

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

我猜你正在传递一个bufsize的缓冲区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终止)。请纠正你的导师。

于 2013-01-31T22:11:12.587 回答
0

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

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

但在这种情况下,您正在更改 buf 的值(作为参数)而不返回/更改您传入的值。

您需要传递指向指针的指针或对指针 (* ) 或 ( &) 的引用,而不仅仅是简单的指针。

于 2013-01-31T22:05:05.713 回答