The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Проблема с 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, 17:39 , 22-Апр-03 (1)
    >Функция работает с значительными массивами памяти, которые перевыделяються 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, 17:58 , 22-Апр-03 (2)
      > for (i=0;i=10000;i++)

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

    • Проблема с realloc, !*! Alexander, 18:21 , 22-Апр-03 (3)
      Спасибо. Выделение памяти заработало. :))))

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

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру