2015-01-02 2 views
1

Мне просто интересно, можно ли добавить/добавить элементы в список на C, и я бы это сделал?Есть ли способ добавить элементы в список/массив? [C]

например.

int numbers[6] = {5,3,5,1,3,6} 

Предположим, я хотел добавить еще одно число к массиву «числа», как бы я это сделал?

+2

Массивы не являются списками. Запомни. – fuz

ответ

6

Ну, исходный массив должен быть malloc 'ed, а не на стеке. Затем вы можете использовать realloc:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int * numbers = malloc(6*sizeof(int)); 

    for(int ii = 0; ii < 6; ++ii) { 
     numbers[ii] = 5; 
    } 

    numbers = realloc(numbers, 7*sizeof(*numbers)); 
    if(!numbers) { 
     printf("Memory allocation failed, sorry dude!\n"); 
     exit(1); 
    } 

    numbers[6] = 7; 

    for(int ii = 0; ii< 7; ++ii) { 
     printf("%d\n", numbers[ii]); 
    } 

    free(numbers); 
} 
+0

Так это просто случай выделения большего объема памяти массиву? – Dinar

+0

Да, но будьте осторожны с 'realloc', так как он может скопировать весь массив в другое место. Это дорогостоящая операция в производственных условиях. – user14717

+0

[не возвращать malloc/realloc] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858) и должен быть '7 * sizeof (* numbers) '. проверьте ошибки в возвратах, вызовите 'free (numbers)', и если 'realloc' не удалось, вы потеряли указатель на выделенную память. – ryanpattison

1

Вам нужно будет использовать realloc.

void *new_array = realloc(old_array, new_array_size); 
if (!new_array_size) { 
    // check for error with realloc 
} 
old_array = new_array; 

Это очень простая реализация std::vector. Для получения дополнительной информации о realloc см. here.

Этот ответ предназначен для более общего случая расширения массива в C. Предполагается, что вы использовали malloc, calloc, etc. для генерации вашего массива. Если не realloc даст неопределенное поведение, так как память не была выделена.

+2

Обратите внимание, что использование realloc в массиве, как определено в исходной задаче проблемы, является неопределенным поведением. Вы можете использовать realloc только для массивов, которые были выделены malloc, calloc, realloc и друзьями. –

+0

Вы правы, это правда. Я отвечал на более общий вопрос, а не на конкретный запрос OP. Не большой ответ с моей стороны. –

1

Самое простое решение, вероятно, было бы сделать массив, который больше, чем это должно быть при объявлении.

Ваш массив примеров имеет шесть элементов, поэтому, возможно, массив будет объявлен как длина восьми. Этого было бы достаточно, чтобы добавить еще два элемента. Вам нужно будет отслеживать как фактическую длину массива, так и количество соответствующих элементов, которые он содержит (восемь и шесть соответственно).

Если вы хотите «добавить» третий элемент, вам нужно будет создать новый массив. Новый массив может быть в два раза длиннее предыдущего (шестнадцати). Скопируйте все элементы предыдущего массива в новый, а затем добавьте новый элемент.

+0

указывает на две клавиши слева от правой смены – peterh

+2

@PeterHorvath, что? – asimes

+0

Я думаю, он пытается подразумевать, что вы должны соответствовать периодам использования в вашем ответе? –

0

Массив имеет фиксированный размер и может быть расширен только через realloc или malloc/memcpy, как уже говорили другие. Существуют различные схемы для повышения эффективности, которые обычно требуют, чтобы массив был непрозрачным и управлялся набором функций.

Если вам нужен только список, то FreeBSD queue primitives, вероятно, хорошее место для начала, они предоставляют списки с одним и двумя ссылками. Код - это один заголовок file. В любом случае он показывает, как реализовать надежный примитив list/queue.

Существуют различные библиотеки для управления коллекциями, такие как GTK/Glib, но это связано с целым рядом других проблем, которые могут вам понадобиться или не нуждаться.

Конечный функционал высокого уровня C, вероятно, libCello, если вы не возражаете подталкивать язык к его границам.

Смежные вопросы