我有这样的功能:
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值。为什么会这样?
答案 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)
问题:
您正在用temp[max] = '\0';
写下堆数组的末尾 - 这会在缓冲区之后放置一个0 1的位置。
谁知道src有多大。你正在传递一个“最大值”,并在没有检查的情况下读取src 大小 - 非常危险。
您正在返回带指针的指针。你需要传入一个双指针并获得正确返回的实际指针值(或者在return语句中返回指针。)
如有疑问,请在调试器中跟踪代码。我的猜测是你的编译器通过优化最后一个分配并将它保留为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; }
(假设src
被null
终止)。请更正您的导师。