c++ - 如何返回在函数中创建的 char 数组?

标签 c++ string scope char

我编程很糟糕已经有一段时间了,我才真正意识到。我之前创建了许多将字符串作为 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/

相关文章:

c++ - 快速找到4的倍数

javascript - NodeJS 中变量范围和 'require' 的奇怪行为

c++ - C++中 vector 的指针算法

.net - VB.NET- 测试空字符串时的性能

Java 正则表达式 : Remove all except specific phrases and words

javascript - 没有 JShint 警告的多行 JSON 字符串

r - 在以列标签作为字符向量的函数中使用 dplyr 动词

c++ - 为什么类的私有(private)变量可以从类中的对象访问?

c++ - 如何为 STL 排序编写带有中间变量的比较器

c++ - 在 printf 上,用字符大小填充内容