在C/++函数之间传递动态大小的二维数组

Passing 2-D array with dynamic size between functions in C/++

本文关键字:动态 二维数组 函数 之间      更新时间:2023-10-16

这是一个"流行"的问题,所以我已经检查了类似的线程,但仍然没有解决我的问题。

我如何声明二维数组来保存"字符串"-我需要字符数组AFAIK数组-并将其用作5个函数的参数,一个接一个,我可以通过引用传递它并动态更新内容,以便下面的函数可以比较它。(我可能会得到10个"字符串"甚至数组,所以我想正确地使用动态数组,因为数组内容因系统而异)。

"string" => C风格字符串,即字符数组。MAXLEN & lt;32;

C的解决方案更令人讨厌,但如果向量可以工作,为什么不呢?

一种可能的C语言解决方案如下:

char **p_strings = calloc(num_strings, sizeof(*p_strings));
for (i = 0; i < num_strings; i++)
{
    // Allocate storage for the i-th string (always leave room for '')
    p_strings[i] = calloc(len_string[i]+1, sizeof(*p_strings[i]));
}

...
// Call a function
my_function(p_strings, num_strings);

当你用完这些数据后,你需要记住free所有这些数据。

如果你需要改变字符串的长度,或者改变字符串的数量,你将不得不做一些相当痛苦的重新分配。所以,如果你在c++中工作,你可能应该只使用std::vector<std::string>

std::vector<std::string> strings;
strings.push_back("Foo");
strings.push_back("Bar");
...
my_function(strings);

您甚至可以使用c_str()为每个元素获得指向c风格字符串的const指针。

假设c++;对于这一点,我认为使用vector to string (string作为第二次元)没有问题:

void foo(vector<string> v) {
    cout << v[0]; // Assuming the elements exist!
}
int main(int argc, char *argv[])
{
    vector<string> vString; // Make the vector
    vString.push_back("something"); // Add a string
    foo(vString); // Print out 'something'
}

在你的编辑中,你还描述了唯一会改变的是实际的字符串,所以当需要时,你可以初始化长度为:

的向量,而不是push_back你的字符串。
vector<string> vString(10); // Assuming a size of 10

,然后正常使用:

vString[4] = "something";

和(作为对注释的响应),在运行时调整大小:

vString.resize(15); // Make it bigger, generates new blank strings