我已经编程不好了很长一段时间,我只是真的意识到.我以前创建了许多函数,它们将字符串作为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<int> returnInts() {
int someNums[] = { 1,2,3,4 };
return vector<int>(someNums,someNums + 4);
}