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

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

Отправлено Alexander , 22-Апр-03 16:44 
Функция работает с значительными массивами памяти, которые перевыделяються realloc. Для ускорения процеса перевыделение
происходит "квантами" по 1000 закладок структуры. Проблема в том,
что в разных участках программы та самая конструкция или нормально
работает или работает только несколько раз с Segmentation fault.
вот пример:

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

#define QUANT 1000

struct{long int size;
          long int memory;
          int *data;
          }selection;

int main(int argc, char *argv[])
{
long int i;

selection.size=0;
selection.memory=QUANT;
selection.data=malloc(selection.memory*sizeof(selection.data));
for (i=0;i=10000;i++)
     {
     if (selection.size==selection.memory)
         {
        selection.memory=selection.memory+QUANT;
        realloc(selection.data,selection.memory*sizeof(selection.data));
        }
   selection.data[selection.size]=45576;
   selection.size++;
   }
return 1;
}


Содержание

Сообщения в этом обсуждении
"Проблема с realloc"
Отправлено pth , 22-Апр-03 17:39 
>Функция работает с значительными массивами памяти, которые перевыделяються realloc. Для ускорения процеса
>перевыделение
>происходит "квантами" по 1000 закладок структуры. Проблема в том,
>что в разных участках программы та самая конструкция или нормально
>работает или работает только несколько раз с Segmentation fault.
>вот пример:
>
>#include <stdio.h>
>#include <stdlib.h>
>
>#define QUANT 1000
>
>struct{long int size;
>          long int
>memory;
>          int *data;
>
>          }selection;
>
>int main(int argc, char *argv[])
>{
>long int i;
>
>selection.size=0;
>selection.memory=QUANT;
>selection.data=malloc(selection.memory*sizeof(selection.data));

/* Что по вашему мнению делает "sizeof(selection.data)"? */
selection.data = (int*)malloc(selection.memory * sizeof(int));
if(!selection.data)
{
    /* Ошибочка */
}

>for (i=0;i=10000;i++)
>     {
>     if (selection.size==selection.memory)
>         {
>        selection.memory=selection.memory+QUANT;
>        realloc(selection.data,selection.memory*sizeof(selection.data));

selection.data = (int*)realloc(selection.data, selection.memory * sizeof(int));
if(!selection.data)
{
    /* Ошибочка вышла */
}

>        }
>   selection.data[selection.size]=45576;
>   selection.size++;
>   }
> return 1;
>}


"Проблема с realloc"
Отправлено pth , 22-Апр-03 17:58 
> for (i=0;i=10000;i++)

А вот это  "i = 10000"  - это анекдот. Так глупо, что сначала и не заметил ;)


"Проблема с realloc"
Отправлено Alexander , 22-Апр-03 18:21 
Спасибо. Выделение памяти заработало. :))))

> for (i=0;i=10000;i++)
это просто описка, прошу прощения.

Если не сложно еще один мини вопрос. Если выделение памяти
не под конкретный тип, а под структуру то вместо
...(int*)realloc... в строке                     selection.data=(int*)realloc(selection.data,selection.memory*sizeof(int));
надо писать
...(структура*)realloc...
Спасибо.


"Проблема с realloc"
Отправлено pth , 22-Апр-03 18:58 
>Если не сложно еще один мини вопрос. Если выделение памяти
>не под конкретный тип, а под структуру то вместо
>...(int*)realloc... в строке          
>          
>selection.data=(int*)realloc(selection.data,selection.memory*sizeof(int));
>надо писать
>...(структура*)realloc...

Никакого значения "под что" выделяется память нет, важен лишь размер выделенного куска. Писать aaa = (bbb *)malloc(sizeof(bbb)); правильнее, если aaa объявлена как  bbb *aaa;