URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1441
[ Назад ]

Исходное сообщение
"Проблема с calloc"

Отправлено dek , 27-Фев-03 17:48 
С помощью calloc хочу создать массив символов, размер которого может увеличиваться (заранее неизвестен). Размерность массива - вначале INIT_SIZE строк по 10 символов, потом добавляю по 5 строк.

char **arr;
    arr=(char **)calloc(INIT_SIZE, sizeof(char *));
    for (i=0;i<INIT_SIZE;i++)
         arr[i]=(char *)calloc(10, sizeof(char));
    arr_size=INIT_SIZE;
..........
// Возникла необходимость увеличить массив - добавляю память еще для 5 элементов
    if (index==arr_size) {            
// Цикл увеличения массива
       for (i=0;i<5;i++)                
           arr[i+index]=(char *)calloc(10, sizeof(char));
       arr_size+=5;    
    }
В переменной index - значение индекса последнего элемента массива

После того как цикл увеличения массива выполнился один раз в первом элементе (arr[0]) оказывается мусор, после второго в arr[1] - тоже мусор.
Не понятно, что сделал не так, вроде все по книжке.
Пишу на C под Linux.
Заранее благодарен откликнувшимся.


Содержание

Сообщения в этом обсуждении
"RE: Проблема с calloc"
Отправлено NL , 27-Фев-03 19:48 
если ты хочешь изменить размер блока памяти (массива), то используй realloc
man realloc

"RE: Проблема с calloc"
Отправлено SergCh , 28-Фев-03 07:16 
>С помощью calloc хочу создать массив символов, размер которого может увеличиваться (заранее
>неизвестен). Размерность массива - вначале INIT_SIZE строк по 10 символов, потом
>добавляю по 5 строк.
>
>char **arr;
>    arr=(char **)calloc(INIT_SIZE, sizeof(char *));
>    for (i=0;i<INIT_SIZE;i++)
>         arr[i]=(char *)calloc(10, sizeof(char));
>
>    arr_size=INIT_SIZE;
>..........
>// Возникла необходимость увеличить массив - добавляю память еще для 5 элементов
>
>    if (index==arr_size) {
        char**newarr=(char **)calloc(INIT_SIZE, sizeof(char *));
        memcpy(); //newarr<-arr
        free(arr);
        arr=newarr;
//     или просто realloc
>// Цикл увеличения массива
>       for (i=0;i<5;i++)
>           arr[i+index]=(char *)calloc(10, sizeof(char));
>       arr_size+=5;
>    }
>В переменной index - значение индекса последнего элемента массива
>
>После того как цикл увеличения массива выполнился один раз в первом элементе
>(arr[0]) оказывается мусор, после второго в arr[1] - тоже мусор.
>Не понятно, что сделал не так, вроде все по книжке.
>Пишу на C под Linux.
>Заранее благодарен откликнувшимся.