Повтор буфера, избегая арифметики с указателями:
Вы можете использовать std :: vector или std :: string, чтобы вам было проще. Оба этих контейнера также могут содержать двоичные данные.
Это решение обладает хорошими свойствами:
- Вам не нужно беспокоиться о нарушениях доступа к памяти
- Вам не нужно беспокоиться о получении размера вашего буфера правильного
- Вы можете добавлять последовательности в любой момент в ваш буфер без перераспределения вручную
.
//Note this works even for binary data.
void appendSequenceToMyBuffer(std::string &sBuffer
, const char *byte_sequence
, int byte_sequence_length
, int N)
{
for(int i = 0; i < N; ++i)
sBuffer.append(byte_sequence, byte_sequence_length);
}
//Note: buffer == sBuffer.c_str()
Альтернатива: для двоичных данных с использованием memcpy:
buffer = new char[byte_sequence_length*N];
for (int i=0; i < N; ++i)
memcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length);
//...
delete[] buffer;
Alternate: для строк с нулевым символом в конце, используя strcpy:
buffer = new char[byte_sequence_length*N+1];
int byte_sequence_length = strlen(byte_sequence);
for (int i=0; i < N; ++i)
strcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length);
//...
delete[] buffer;
Альтернатива: если вы заполняете буфер одним значением:
buffer = new char[N];
memset(buffer, byte_value, N);
//...
delete[] buffer;