如何返回在函数中创建的 char 数组?
我编程很糟糕已经有一段时间了,我才真正意识到.我之前创建了许多将字符串作为 char 数组(或至少指向它们的指针)返回的函数.
I've been programming badly for quite a while and I only really just realised. I have previously created many functions that return character strings as char arrays (or at least pointers to them).
前几天有人指出,当我的函数返回时,我的函数指向的 char 数组已经超出范围,我现在基本上指向的是随机的内存位(一个讨厌的悬空指针).
The other day someone pointed out that when my functions return the char arrays pointed to by my functions have gone out of scope and I'm essentially now pointing to a random bit of memory (A nasty dangling pointer).
我有一段时间没有真正注意到这一点,因为输出到控制台时的 char 数组似乎没有损坏(可能是因为没有时间覆盖该数据).然而,当我返回一个通过读取经常损坏的串行端口生成的字符串缓冲区(字符数组)时,我确实注意到了这一点.
I didn't really notice this for a while because the char arrays when outputted to the console didn't appear to be corrupt (probably because there wasn't time for that data to be overwritten). I did however notice this when I was returning a string buffer (char array) generated by reading the serial port which was frequently corrupt.
那么,我应该如何做到最好?
So, how best should I do it?
我的错误代码如下:
#include <cstdlib>
#include <iostream>
using namespace std;
char* myBadFunction(){
char charArray[] = "Some string
";
char* charPointer = charArray;
return charPointer;
}
int main(int argc, char** argv) {
cout << myBadFunction();
return 0;
}
我知道我可能应该在调用函数之前在程序中分配内存或创建一个全局变量来放入返回的字符串,但是如果我调用的函数被许多不同的程序使用,它应该如何知道函数的大小缓冲区被提前传入,什么时候删除这个内存?
I understand that I should perhaps allocate memory in the program before calling the function or create a global variable to put the returned string in, but if my called function is used by many different programs when how should it know the size of the buffer being passed into it in advance and when should this memory be deleted?
以下代码也没有按照我的意愿正确执行:
The following code also doesn't do what I want it to properly:
#include <cstdlib>
#include <iostream>
using namespace std;
void fillArray(char* charPointer){
char charArray[] = "Some string
"; // 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;
}
我想填充指针解析指向的数组,但这不会发生在上面的代码中.
I want to fill the array that the pointer parsed points to but this doesnt' happen in the code above.
另外,我什么时候应该使用 new[] 命令来创建我的数组?需要吗?我应该什么时候调用 delete[] .
Also, when should I use the new[] command to create my array? is it needed? and when should I call delete[] on it.
非常感谢,这显然是非常基本的,但我一直做错了一段时间.
Many thanks for this, its obviously very fundamental but something I've been doing wrong for a while.
推荐答案
最简单的方法是返回一个 std::string
,如果您需要访问内部 char 数组,请使用 std::string::c_str()
.
The simplest way would be to return a std::string
, and if you needed access to the internal char array use std::string::c_str()
.
#include <iostream>
#include <string>
using namespace std;
string myGoodFunction(){
char charArray[] = "Some string
";
return string(charArray);
}
int main(int argc, char** argv) {
cout << myGoodFunction();
return 0;
}
如果您需要返回 char 数组以外的内容,请记住指针可以用作迭代器.这允许您将数组封装在向量或类似结构中:
If you need to return something other than a char array, remember that pointers can be used as iterators. This allows you to encapsulate an array in a vector or a similar structure:
vector<int> returnInts() {
int someNums[] = { 1, 2, 3, 4 };
return vector<int>(someNums, someNums + 4);
}
相关文章