Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.04.2009, 21:04   #1
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию Проблемы с выделением динамической памяти malloc (recalloc)

Код:
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
  char *input;
  char z;
  int  k=-1,i;
  clrscr();
  input=(char *)malloc(sizeof(char)); // выделяем память под один символ
  while (z=getchar()!='.')
  {
	k++;
	if (z!='.') {
		realloc(input,sizeof(char)*(k+1));
		input[k]=z;
	}
  }
  getch();
  free(input);
	return 0;
}
при маленьком вводе строки например "апрапрапрапр." - всё норм работает, увеличиваю строку до 120 символов вознивает проблемы с памятью.
slips вне форума
Старый 26.04.2009, 21:22   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
увеличиваю строку до 120 символов вознивает проблемы с памятью.
А как это проявляется? И что должна делать программа? Просто выделять память?
Ввел около 500 символов - ничего не вылетело, не поломалось.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 27.04.2009, 10:57   #3
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

видимо при большом значение поля функция recalloc не успевает переадрисоваться..)
slips вне форума
Старый 27.04.2009, 14:01   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от slips
Хм.. что то мне плохо вериться что работает..
Добавил "printf("\nOK!");" перед очищением.

Ввел около 500 символов. Результат на скрине.

Цитата:
видимо при большом значение поля функция recalloc не успевает переадрисоваться..)
Скорее всего, дело именно в этом.
Изображения
Тип файла: jpg 27_4_2009 13-59-33.jpg (34.9 Кб, 133 просмотров)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 27.04.2009, 16:08   #5
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

функция не успевает переадресоваться? о_О
что-то новенькое)

в какой среде вы работаете?
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума
Старый 27.04.2009, 21:47   #6
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

Цитата:
Сообщение от wyvern Посмотреть сообщение
функция не успевает переадресоваться? о_О
что-то новенькое)

в какой среде вы работаете?
Делаю элементарный прогон программы..)
в начале произвожу сравнение в выделеной памятью.. после ввода нескольких символов проверяю.. память всё в норме ввожу ещё 200 символов..) доходит до n-го символа... и пытается записать в несущесвующую ячейку инфу...) соответсвенно вылетает.. отсюда вывод.. либо я что то с памятью делаю не так, либо recalloc- не успевает переместить указатель в начало.. блока выделеной памяти..
slips вне форума
Старый 29.04.2009, 19:27   #7
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

Вот исправил нормальный и рабочий код.. может кому то понадобиться
Код:
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
  char *input;
  char z;
  int  k,i=0;
  clrscr();
  input=(char *)malloc(sizeof(char)); // выделяем память под один символ
  for (k=0;(z=getchar())!='.';)          // вводим строку пока не будет введена точка.
   {
	i++;
	*(input+k++)=z;
	input=(char *) realloc (input , (i+2)); // перевыделяем память для нового символа
   }
  *(input+k++)='\0';  // говорим что это последний символ в строке
  printf("%s",input);  
  getch();
  free(input);
	return 0;
}
slips вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по структурам и динамической памяти. ROD Общие вопросы C/C++ 4 12.04.2009 18:20
Вставка по динамической памяти в Delphi Schakhmaev Помощь студентам 1 24.06.2008 01:27
поиск с выделением photozaz Компоненты Delphi 1 22.05.2008 15:46
Проблемы с динамической структурой данных Mailz Общие вопросы C/C++ 1 21.05.2008 00:18