我编程很糟糕已经有一段时间了,我才真正意识到。我之前创建了许多将字符串作为 char 数组(或至少指向它们的指针)返回的函数。
前几天有人指出,当我的函数返回时,我的函数指向的 char 数组已经超出范围,我现在基本上指向的是随机的内存位(一个讨厌的悬空指针)。
我有一段时间没有真正注意到这一点,因为输出到控制台时的 char 数组似乎没有损坏(可能是因为没有时间覆盖该数据)。然而,当我返回一个通过读取经常损坏的串行端口生成的字符串缓冲区(字符数组)时,我确实注意到了这一点。
那么,我应该如何做到最好?
我的错误代码如下:
#include <cstdlib>
#include <iostream>
using namespace std;
char* myBadFunction(){
char charArray[] = "Some string\n";
char* charPointer = charArray;
return charPointer;
}
int main(int argc, char** argv) {
cout << myBadFunction();
return 0;
}
我知道我可能应该在调用函数之前在程序中分配内存或创建一个全局变量来放入返回的字符串,但是如果我调用的函数被许多不同的程序使用,它应该如何知道函数的大小缓冲区被提前传入,什么时候删除这个内存?
以下代码也没有按照我的意愿正确执行:
#include <cstdlib>
#include <iostream>
using namespace std;
void fillArray(char* charPointer){
char charArray[] = "Some string\n"; // Create string
charPointer = charArray; // Not correct, want to fill predefined array with created string
return;
}
int main(int argc, char** argv) {
char predefinedArray[50] = {0};
fillArray(predefinedArray);
cout << predefinedArray;
return 0;
}
我想填充指针解析指向的数组,但这不会发生在上面的代码中。
另外,我什么时候应该使用 new[] 命令来创建我的数组?需要吗?我应该什么时候调用 delete[] 。
非常感谢,这显然是非常基本的,但我一直做错了一段时间。
最佳答案
最简单的方法是返回 std::string
,如果您需要访问内部 char 数组,请使用 std::string::c_str()
.
#include <iostream>
#include <string>
using namespace std;
string myGoodFunction(){
char charArray[] = "Some string\n";
return string(charArray);
}
int main(int argc, char** argv) {
cout << myGoodFunction();
return 0;
}
如果您需要返回 char 数组以外的内容,请记住指针可以用作迭代器。这允许您将数组封装在 vector 或类似结构中:
vector<int> returnInts() {
int someNums[] = { 1, 2, 3, 4 };
return vector<int>(someNums, someNums + 4);
}
关于c++ - 如何返回在函数中创建的 char 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3733582/