изменение размера массива в c с помощью realloc

У меня проблема в ansi-C. Я пытаюсь сделать стек в C на массивах. Но у меня проблема с функциями pop и push - я не знаю, как изменить размер массива. Я думаю, что я могу сделать это как-то с помощью функции realloc(), но я не знаю, как это сделать.

Кто-нибудь может помочь?


person aviss    schedule 19.03.2015    source источник
comment
Если это C, почему вы пометили вопрос как C# и использовали C# в заголовке? Это совершенно разные языки.   -  person Jon Skeet    schedule 19.03.2015
comment
Вы можете взглянуть на ссылку ниже: заголовок stackoverflow.com/questions/3827892/   -  person Sormita Chakraborty    schedule 19.03.2015


Ответы (1)


Вот пример кода:

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

int main(int argc, char **argv)
{
    int *array = NULL;
    array = malloc(5*sizeof(*array));
    if (array == NULL)
    {
        printf("Memory allocation error\n");
        exit(1);
    }
    /* Now array has 5 entries, from 0 to 4 */
    array[0] = array[1] = array[2] = array[3] = array[4] = 0;
    array = realloc(array, 10*sizeof(*array));
    if (array == NULL)
    {
        printf("Memory allocation error\n");
        exit(1);
    }
    /* Now array has 10 entries, from 0 to 9 */
    array[5] = array[6] = array[7] = array[8] = array[9] = 0;
    free(array);
    array = NULL;
}

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

Учтите, что в вашей будущей реализации вызов realloc() каждый раз, когда новые данные помещаются в стек, слишком неэффективен. Обычная практика состоит в том, чтобы увеличить емкость массива, по крайней мере, умножив ее на 2 и сохранив емкость (максимальное количество элементов, которые может содержать массив) в дополнение к его текущему размеру. Обычно библиотеки никогда не сжимают массив, а расширяют его, если ему нужно больше места.

person juhist    schedule 19.03.2015