Передача двумерного массива с динамическим размером между функциями в C / ++ - PullRequest
1 голос
/ 25 августа 2011

Это «популярный» вопрос, поэтому я уже проверил похожие темы, но все еще не решил мою проблему.

Как я могу объявить 2-D массив для хранения "строк" - мне нужен массив массивов символов AFAIK - и использовать его в качестве аргумента для 5 функций одна за другой, где я могу передать его по ссылке и обновить содержимое динамически, поэтому следующая функция может сравнить его. (Я мог бы получить 10 «строк» ​​или даже пустой массив, поэтому я хочу сделать это правильно с динамическим массивом, поскольку содержимое массива разное в разных системах).

"string" => Строка в стиле C или массив символов. МАКСЛЕН <32; </p>

C решение было бы более нежелательным, но если векторы могут работать, почему бы и нет.

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Одним из возможных решений в 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 для каждого элемента, используя c_str().

2 голосов
/ 25 августа 2011

Предполагая 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
...