该函数收集数组并 returns 它。 ciout之后内存还是被这个数组占用了吧?

The function collects the array and returns it. After ciout memory is still occupied by this array, right?

我有以下功能:

void setFore(const short arg) {
         char ansicode[12] = "\e[38;5;";
         char code[4];
         snprintf(code, 4, "%d", arg);
         strcat(ansicode, code);
         strcat(ansicode, "m");
         std::cout << ansicode; }

使用起来像

std::cout << "Some text";
setFore(50);
std::cout << "Some text\n";

执行后自动删除array ansicode。 我想做这样的功能:

char* setFore(const short arg) {
         char ansicode[12] = "\e[38;5;";
         char code[4];
         snprintf(code, 4, "%d", arg);
         strcat(ansicode, code);
         strcat(ansicode, "m");
         return &ansicode; }

并将其用作std::cout << "Some text" << setFore(50) << "Some text\n";。 但是还有一个问题,ansicode数组占用的内存还会继续占用内存吗?由于数组不是用new创建的,所以即使分配了指针也无法释放它。我该怎么办?

But one question remains, will the memory occupied by the ansicode array continue to occupy the memory?

C 风格的数组有自动生命周期,它们会在局部范围结束后被销毁,所以在函数返回后尝试对它们做任何事情是未定义的行为,你应该考虑使用像 std::string:

std::string setFore(const short arg) {
     return "3[38;5;" + std::to_string(arg) + "m";
}

返回本地数组将不起作用,因为它会在函数作用域结束时被销毁。我建议改用 std::stringstd::ostringstream

#include <sstream>
#include <string>

std::string setFore(short arg) {
    std::ostringstream os;
    os << "\x1b[38;5;" << arg << 'm';
    return os.str(); 
}

如果您 以后出于某种原因需要 char*,您可以使用返回字符串的 data()c_str() 成员函数。

正如 Thomas Matthews 在评论中指出的那样,\e 不是标准转义序列,因此我将其替换为十六进制值 1b27 dec)。