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

时间:2011-08-25 13:32:53

标签: c++ c arrays dynamic-arrays character-arrays

这是“受欢迎”的问题所以我已经检查了类似的主题,但仍然没有解决我的问题。

如何声明二维数组来保存“字符串” - 我需要一组字符数组AFAIK - 并将它作为参数连接到5个函数,我可以通过引用传递它并更新动态内容所以跟随功能可以比较它。 (我可能会得到10个“字符串”甚至数组,所以我想用动态数组正确地执行它。因为系统不同,数组内容不同。

“string”=> C风格字符串又名字符数组。 MAXLEN< 32;

C解决方案会更加不受欢迎,但如果矢量可以起作用,为什么不行。

2 个答案:

答案 0 :(得分:3)

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 '\0')
    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风格字符串的常量指针。

答案 1 :(得分:2)

假设C ++;为此,我发现使用向量字符串没有问题(字符串用作第二个维度):

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