Векторная структура в C - PullRequest
       5

Векторная структура в C

0 голосов
/ 17 декабря 2018

Я хочу создать ArrayList или Vector in C. Возможно, я смогу узнать, нахожусь ли я на правильном пути или совсем не в базе

Так что, если у меня есть ArrayList Struct, который изначально содержит массив,установите значение 10 и счетчик для отслеживания того, сколько элементов было заполнено в массиве, например:

typedef struct ArrayList
{
     int counter;
     int arr[10];
}

Может ли массив arr быть заменен другим массивом, который в два раза больше исходногомассив?Если да, то как мне это сделать?

У меня есть следующий фрагмент кода в функции add ()

if ( arrList->counter == (sizeof(arrList->arr)/sizeof(int))  )
{
     int tempArray[((arrList->counter + 1) * 2)];
     for (int i = 0; i < arrList->counter; i++)
     {
          tempArray[i] = arrList->arr[i];
     }
     strcpy( arrList->arr, tempArray );
}

Я на правильном пути или есть лучший способсоздать растущий массив?

1 Ответ

0 голосов
/ 18 декабря 2018

Ваш подход не так хорош, так как он предполагает копирование структуры во временный примитивный массив.

Очень хорошее решение вашего вопроса - это так называемый гибкий массив.Google это для получения дополнительной информации.По сути это выглядит следующим образом.

struct my_fam_array_t {
    int arr_size;
    int arr[];
};

Чтобы использовать его, вы всегда объявляете его как указатель следующим образом

struct  my_fam_array_t *arr5;

И затем инициализируете его следующим образом:

arr5 = malloc(sizeof(struct my_fam_array_t) + fam_size));

Где fam_size должен быть размером, который вам требуется для массива.

Еще две вещи, не забудьте установить размер массива в структуре, а также проверить состояние выделения памяти и обработать любые ошибки.

Не забудьте освободить его после использования.

Теперь вы можете обычно использовать массив, например

arr5->arr[3] = some_value;

Теперь вы можете создать функциюизменить размер массива.Я не собираюсь писать это, но то, что нужно сделать, это:

malloc новая структура с новым размером

Скопировать старый массив в новую структуру

Донне забудьте освободить старый массив

Это может быть новым для вас, учитывая, что вы новичок, однако гибкий массив - это инструмент, который вам нужен.

Кстати, вы можете использовать reallocКроме того, прочитайте об этом, это может быть полезно, однако будьте очень осторожны, чтобы правильно обработать сбой нехватки памяти.Google о realloc и SEI CERT C Стандарты

Редактировать:

Убедитесь, что вы используете C99 или выше.Наоборот, вам придется использовать структуру с размером массива 1 и вычесть 1 из размера malloc.Вы можете использовать массив с размером 0, если ваш компилятор поддерживает это расширение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...