Я провел обширные исследования, прежде чем задавать этот вопрос здесь, но я не мог найти ответа.Как использовать динамический массив C внутри структуры
У меня есть простая структура, которая содержит массив другой структуры и общее:
typedef struct {
int total;
struct Struct1 arrayOfStructs[];
} Struct2;
Struct2 _myVar; // the variable I need
arrayOfStructs[]
должен быть массивом C, содержащие структуры типаStruct1
(этот синтаксис не действует, потому что вам нужен постоянная величина)total
является подсчетarrayOfStructs
- (
Struct1
не имеет значения, он просто содержит некоторые примитивные данные)
Проблема в том, что я хочу, чтобы этот массив был динамическим. Я хочу быть в состоянии сделать это:
for (int i = 0; i < _myVar.total; i++) {
NSLog(@"%d", _myVar.arrayOfStructs[i].index);
}
Я попытался следующие:
typedef struct {
int total;
struct Struct1 *arrayOfStructs; // USING A POINTER HERE
} Struct2;
Struct2 _myVar; // the variable I need
и для добавления значений:
int total = ++_myVar.total; // increase total count
_myVar.arrayOfStructs = realloc(_myVar.arrayOfStructs, total * sizeof(Struct1));
_myVar.arrayOfStructs[total - 1] = {1, 5.3}; // appending a new value in the array
Приведенный выше код добавляет значение правильно, но после того, как передавая его в NSData
и извлекая его, элементы массива теряются, и я получаю некоторые плохие указатели:
[NSData dataWithBytes:&_myVar length:sizeof(_myVar) + sizeof(Struct1) * total];
Я подозреваю, что это связано с тем, что мне нужно сделать sizeof(_myVar) + sizeof(Struct1) * total
вместо sizeof(_myVar)
, поэтому из-за разных адресов указателей я получаю плохие данные. Я думаю, что не правильно копирую данные в свою структуру.
Любая помощь будет принята с благодарностью!
Если вы используете указатель 'struct Struct1 * arrayOfStructs;', вы не знаете, где находится полезная нагрузка. Вы можете быть уверены, что это не будет непосредственно после 'Struct2 _myVar;'. Итак, если '[NSData dataWithBytes: & _ myVar length: sizeof (_myVar) + sizeof (Struct1) * total];' принимает 'sizeof _myVar + total * sizeof (Struct1)' байт, начиная с '& _myVar'; который возьмет «int», указатель и много мусора, на которые вы не имеете права. –
Я понимаю, спасибо. И как я мог делать то, что мне нужно, я даже могу изменить способ добавления данных в NSData, но я не уверен, как это сделать. – Calin