2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Динамический массив Си
Сообщение11.12.2013, 19:35 


20/10/12
235
Добрый вечер, уважаемые участники форума! На этот раз камнем преткновения в моей практике программирования на Си стал динамический массив. Я выделяю память под BLOCK элементов и по мере продвижения указателя перевыделяю память realloc (да-да она может и не выделится, но не до этого пока)
Так вот если realloc перенес информацию в другое место, нужно за собой подчищать память, а из-за итого у меня вылезает непонятная ошибка
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
 
#include <stdio.h>
#include <string.h>
#define BLOCK 10
#define TRUE 1
#define MAX_WIDTH 80 //console size, can be changed
char * JustifyText(char const* str, int width); //Прототип функции

int main(void)
{
  char *st_point = (char *)malloc(BLOCK);
  char *cur_point = st_point;
  char *cpy_point = st_point; //copy for memory cleaning
  unsigned r_pos, current_size = BLOCK, width;
 
  if(st_point == NULL)
  {
    printf("Error of memory allocation!\n");
    return -1;
  }
  printf("E11: Text alignment\nInput width:\n");

  do{
  scanf("%i", &width );
  if(width <= 0 || width > MAX_WIDTH)
    printf("Incorrect input, please, try again!\n");
  }while(width <= 0 || width > MAX_WIDTH);

  getchar(); //miss enter once!
  printf("Input text for alignment (press <Enter> x 2 to stop) :\n");
  printf("START ADRESS: %i\n", st_point);

      while(TRUE) // Exit == press <Enter> x 2
    {
     *cur_point = getchar();                              
     r_pos = cur_point - st_point; //relative position
     if(r_pos)
     if(*cur_point == '\n' && *(cur_point - 1) == '\n')
     {
        *cur_point = 0; //делаем строку
        break;
     }

     if(r_pos >= current_size) //динамически выделяем память
     {
       current_size += BLOCK; //увеличиваем
       st_point = (char *)realloc(st_point, current_size);
         if(st_point != cpy_point)//перенос
       {
         free(cpy_point);//здесь кроется основная ошибка? но почему?
         cpy_point = st_point;
         cur_point = st_point + r_pos;
        }
     }
     ++cur_point;
    }
  puts(st_point);
  return 0;
}
 

 Профиль  
                  
 
 Re: Динамический массив Си
Сообщение11.12.2013, 19:57 
Заслуженный участник


04/05/09
4587
Подчищать не надо, realloc это делает сам.

 Профиль  
                  
 
 Re: Динамический массив Си
Сообщение11.12.2013, 20:02 
Заслуженный участник
Аватара пользователя


06/10/08
6422
shukshin в сообщении #799261 писал(а):
Так вот если realloc перенес информацию в другое место, нужно за собой подчищать память, а из-за итого у меня вылезает непонятная ошибка
Не нужно, realloc сам это делает.

 Профиль  
                  
 
 Re: Динамический массив Си
Сообщение11.12.2013, 20:02 


20/10/12
235
А, понятно, спасибо

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group