【问题标题】:How to allocate memory to array of character pointers?如何为字符指针数组分配内存?
【发布时间】:2018-06-04 10:13:40
【问题描述】:

我想为以下 char 指针数组分配内存:

char *arr[5] =
    {
        "abc",
        "def",
        "ghi",
        "jkl"
    };

    for (int i = 0; i < 4; i++)
        std::cout << "\nprinting arr: " << arr[i];

以下不起作用:

char *dynamic_arr[5] = new char[5];

为字符串数组分配内存的方法是什么?

【问题讨论】:

  • C 和 C++ 是两种非常 不同的语言,字符串和动态分配以及数组在两种语言中的处理方式非常不同。请选择一个。
  • @MaximEgorushkin 甚至没有接近。 C 和 C++ 可能有一些共同的语法,但它们之间还有很多不同之处,尤其是在语义上。与 Java、JavaScript 和 C# 非常相似,它们与 C 和 C++ 都有一些共同的语法,但它们绝对不是同一种语言。
  • @MaximEgorushkin - OP 所展示的代码甚至与 C 语言相差甚远。而且,迂腐的是,C 从来都不是 C++ 的严格子集。
  • 同样这段代码在 C++ 中无效,字符串文字不能初始化非 const char *
  • @MaximEgorushkin - 是的,我知道在 C 和 C++ 中都有解决问题的方法。值得注意的是,在两种语言中同时工作的技术被 C 和 C++ 的经验丰富的从业者认为是非常糟糕的技术。

标签: c++ arrays pointers


【解决方案1】:

在 C++ 中有 more 方法来初始化字符串数组。您可以只使用 string 类。

string arr[4] = {"one", "two", "three", "four"};

对于C中的char数组,可以使用malloc

char *arr[5];
int len = 10; // the length of char array
for (int i = 0; i < 5; i++)
    arr[i] = (char *) malloc(sizeof(char) * len); 

【讨论】:

  • 你为什么建议使用 malloc 呢?
  • 他的标签是CC++,所以我也提出了一个C 选项。
  • 哦,我明白了。由于您在第一句话中提到了 C++,我建议您提及您的答案是针对 C. PS。将malloc的return返回不被认为是不好的形式吗?
【解决方案2】:

C 和 C++ 语法混合在一起,不确定您是在使用 C 还是 C++。如果您正在尝试使用 C++,以下是一种安全的方法。

std::array<std::string, 10> array {};

对于完全动态的,可以使用std::vector

std::vector<std::string> array;

【讨论】:

  • 很好,我已经删除了我过时的建议 :)
【解决方案3】:

您所发现的可能如下:

char **dynamic_arr = new char*[5]; //5 is length of your string array
for(int i =0;i<5;i++)
{
    dynamic_arr[i] = new char[100]; //100 is length of each string
}

但是使用char* 非常麻烦。我建议你使用 C++ 中的string 库来存储和操作字符串。

【讨论】:

  • 这是一个糟糕的建议。缺少一个额外的级别来获得three-star programmer 的资格。
  • @YSC:你为什么说这是一个糟糕的建议?
【解决方案4】:

由于这是一个 C++ 问题,我建议采用惯用方式来处理固定/可变文本集合:std::arraystd::vectorstd::string

为字符串数组分配内存的方法是什么?

// If you have a fixed collection
std::array<std::string, 4> /* const*/ strings = {
    "abc", "def", "ghi", "jkl"
};

// if you want to add or remove strings from the collection
std::vector<std::string> /* const*/ strings = {
    "abc", "def", "ghi", "jkl"
};

然后,您可以直观地操作strings,而无需手动处理内存:

strings[2] = "new value for the string";
if (strings[3] == strings[2]) { /* ... */ } // compare the text of the third and fourth strings
auto pos = strings[0].find("a");
// etc.

【讨论】:

  • 由于OP提到/询问了内存分配,您还可以指定std::vector&lt;&gt;的范围构造函数,或者可能是使用std::vector::reserve()保留内存的选项
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 2021-02-13
  • 1970-01-01
  • 2016-05-25
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多