Intereting Posts
лучшие статьи об организации файлов кода в C Oracle Pro * C / OCI устанавливают обработчики для SIGSEGV / SIGABRT и друзей – почему и как отключить? C добавление char для char * Что такое концепция использования extern в c / c ++? const char ** a = {“string1”, “string2”} и указательный арифметический Получение домашнего каталога в Mac OS X с использованием языка C Как использовать функции библиотеки c library на языке ассемблера? Алгоритм для взятия номера и вывода его английского слова Предупреждение преобразования из строки const в char * при инициализации массива строк C C – Невозможно получить доступ к памяти по адресу Почему скомпилированные файлы classов Java меньше C скомпилированных файлов? Переносная сериализация значений с плавающей запятой IEEE754 Я хочу, чтобы иметь возможность печатать трассировки стека java style в c Странное предупреждение GCC о classе и типе хранения Вычитание двух чисел без использования оператора «-»

Динамический массив с использованием ANSI C

У меня есть массив символов

char *data[]= {"11", "22", "33", "44", "55"}; 

Как добавить некоторые дополнительные элементы в конце? data[]="66";

Мне нужен динамический массив в C.

Спасибо

Массивы, созданные с использованием синтаксиса [] , не являются динамическими, длина устанавливается во время компиляции и не может измениться.

UPDATE : На самом деле C99 добавляет так называемые массивы переменной длины, которые могут получить свою длину во время выполнения. Однако после того, как они были инициализированы, они не могут сжиматься или расширяться, поэтому все еще применяется.

Однако массив имеет тривиальное выражение, когда у вас есть указатели: массив может быть представлен как указатель на первый элемент и длина.

Таким образом, вы можете создать новый массив, динамически распределяя память с помощью malloc() :

 size_t array_length = 3; int *array = malloc(array_length * sizeof *array); if(array != NULL) { array[0] = 11; array[1] = 22; array[2] = 33; } 

Вы не можете использовать {} список элементов здесь, это можно использовать только при инициализации массивов, объявленных с использованием синтаксиса [] .

Чтобы увеличить массив, вы можете использовать функцию realloc() чтобы перераспределить память и скопировать старые значения:

 size_t new_length = array_length + 1; int *bigger_array = realloc(array, new_length * sizeof *bigger_array); if(bigger_array != NULL) { bigger_array[new_length - 1] = 44; /* We have successfully grown the allocation, remember the new address. */ array = bigger_array; array_length = new_length; } 

Обратите внимание, что каждый раз, когда вы вызываете malloc() (или realloc() ), он может возвращать NULL если ему не удалось выделить запрошенный блок. Вот почему нужны инструкции if . Я сократил первоначальный размер немного по сравнению с вашим примером, чтобы уменьшить количество требуемых линий назначения, чтобы сделать пример короче.

Чтобы сделать это более эффективным, типичный динамический массив использует два значения длины: один для реального массива (сколько значений находится в массиве прямо сейчас) и один для памяти (сколько значений у нас есть место для хранения). Если последнее значение вырасти в кусках, общее количество распределений памяти может быть сокращено немного, конечно, за счет некоторой памяти.

vc_vector

 vc_vector* vector = vc_vector_create(0, sizeof(const char *), NULL); vc_vector_push_back(vector, "11"); vc_vector_push_back(vector, "22"); vc_vector_push_back(vector, "33"); for (int i = 0; i < vc_vector_count(vector); ++i) { printf("%s ", (const char*)vc_vector_at(vector, i)); } // output: 11 22 33 vc_vector_release(vector);