Если вы хотите memcpy две структуры, то память в обоих из них должна быть непрерывной. Но вам нужно будет заранее определить num
.
struct test_struct {
int num;
char ** values;
} * TestStruct;
int _num = 0;
// find _num
TestStruct = malloc (sizeof (struct test_struct) + (sizeof(char*) * _num) + (LENGTH * _num));
TestStruct->num = _num;
TestStruct->values = &TestStruct + sizeof (struct test_struct);
for (int i = 0; i < _num; i++){
TestStruct->values[i] = &TestStruct + sizeof (struct test_struct) + (i * LENGTH);
}
Причина Я изменил символ * на символ **, потому что, используя символ * становится все труднее получить доступ к строк после первого (я предполагаю, что они нулем). Кроме того, после вызова memcpy вы должны обновить все указатели строк в новой структуре.
Чтобы тетсру вы могли бы сделать это:
memcpy (buf, TestStruct->values[0], LENGTH * TestStruct->num);
Но в BUF, однако, вы бы увидели только первую строку (если ваши строки не не завершается нулем). Вам нужно будет увеличивать указатель после каждого символа с нулевым завершением до тех пор, пока вы не узнаете, с num
, что вы достигли конца буфера.
Теперь, когда я больше понимаю контекст вашего запроса, рассмотрим следующее.
Если вы используете UDP-пакеты, вы должны отправить данные в один пакет, чтобы он поступал в ожидаемом порядке. Когда отправляется более одного пакета, он может выйти из строя.
Из-за этого вам необходимо убедиться, что размер данных < = 512 байт - это максимальный размер пакета UDP.
Кроме того, вам необходимо убедиться, что все данные находятся в непрерывной памяти. Я буду считать, что у вас есть данные, которые уже в структуры предоставленной Вами в этом примере:
// this function puts the struct in contiguous memory
int PrepareBuffer (struct test_struct TestStruct, char ** buffer){
char * cast = (char *) &TestStruct->num;
* buffer = malloc ((TestStruct->num * LENGTH) + sizeof (int));
for (int i = 0; i < sizeof (int); i++) *buffer[i] = cast[i];
for (int i = 0; i < (TestStruct->num * LENGTH); i++) *buffer[i + sizeof (int)] = TestStruct->values[i];
return 0;
}
Вы должны реализовать еще одну функцию на приемном конце, отображающей буфер struct test_struct
. Кроме того, я пропустил проверку ошибок для ясности. Вы должны проверить, насколько большой будет пакет, чтобы выделить память
(это должно быть < = 512)
. Вы также должны убедиться, что malloc возвращает указатель none-null.
размер этой структуры является постоянным – tay10r
Размер структуры никогда не меняется, это просто 'SizeOf (test_struct)'. Если вы хотите знать общую выделенную память, тогда да, вам также нужно будет делать 'num * sizeof (* values)'. –
@Taylor Correct. Однако в буфере, который будет содержать его, должно быть выделено достаточно памяти для хранения 'values' Поэтому я вычисляю, как большие 'values' с' num * LENGTH', а затем добавляют размер самой 'struct'. – justynnuff