Я не думаю, что нужен динамически изменяемый массив. В C есть два способа буквально динамически изменять размер массива: выделить его с malloc
или подобным; или используйте C99 VLA. Но в этом случае, когда у вас есть строки различной длины, несомненно, важным моментом является запись правильных байтов в правильном порядке? Лично я бы предпочел что-то подобное, может быть:
char * strings[] = {"okay\r\n", "high\r\n", "low\r\n"};
serial_send(strings[msg_number], strlen(strings[msg_number]));
Вам не нужно вызывать strlen, обязательно, вы можете сохранить длины в другом массиве. Но даже на самом крошечном встроенном устройстве подсчет до 6 занимает очень мало времени по сравнению с отправкой последовательных данных.
Конечно, я предполагаю, что любая функция, которую вы вызываете для фактической отправки данных, принимает указатель и длину. Но если это не так, я не вижу, как помогает динамически изменяемый массив.
Я думаю, что общая проблема, которая затрудняет ответ на этот вопрос, заключается в том, что вы на самом деле не говорите, каков "размер" вашего массива, или почему он имеет какое-либо отношение к количеству фактически записанных байтов к последовательному порту.
Редактировать: с вашим дополнительным объяснением ключевой вещью представляется эта структура, в которую "передаются" три отдельные строки. Не уверен, что означает передача строки в структуру. Если это выглядит сейчас так:
struct serialmessage {
char first[6];
char second[6];
char third[6];
};
serialmessage msg;
memcpy(msg.first, mod1_status_char, 6); // etc.
Тогда, возможно, было бы лучше сделать это:
char *char mod1_status_char; // etc.
switch(status) {
case 0x00:
mod1_status_char = strings[0]; // or #define STATUS_OK 0
mod2_status_char = strings[0];
mod3_status_char = strings[0];
break;
case 0x10:
mod1_status_char = strings[0];
mod2_status_char = strings[0];
mod3_status_char = strings[2]; // STATUS_LOW
};
serialmessage msg[3*MAX_STRING_LENGTH+1];
strcpy(msg, mod1_status_char); // or use stpcpy if you have it
strcat(msg, mod2_status_char);
strcat(msg, mod3_status_char);
Затем отправьте структуру, используя strlen (msg). msg здесь не совсем «динамический», но длина строки в нем варьируется в зависимости от данных, что может быть тем, что вам нужно. Или, может быть, я все еще неправильно понимаю роль этих трех массивов символов.
Копирование строк больше, чем необходимо, кажется мне сложным. Обращайтесь к ним по указателю до последнего возможного момента, когда ваше сообщение будет собрано, и вы минимизируете количество мест в вашем коде, где вы должны получить правильный размер буфера.