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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 21:54   #1
Семоха Валерий
 
Регистрация: 04.10.2011
Сообщений: 7
По умолчанию Проблемы с динамическим распределением памяти в Си

Здравствуйте, необходима помощь.
Получил задание на лабораторную работу по C (именно C, не C++)
"На входе строка. Необходимо разделить её на 2 равные части, и поменять их местами. Например "abcdefghijklmnopq" ->"jklmnopqabcdefghi""
С самим разделением и перестановкой проблем не возникло.
Закавыка в том, что нужно использовать динамическое расширение памяти. Просто, само по себе, выделение памяти (calloc) работает нормально. То есть, если я беру
char* str1;
str1=(char*)calloc(1000, sizeof(char));
то программа отлично работает.
Но мне нужно, чтобы изначально выделенная память была небольшая, а при вводе новых символов ее размер увеличивался (нужно использовать ф-цию realloc). А вот с realloc начинаются проблемы.
Начальный размер строки я взял 10 симв. типа char. При вводе в программу 9 символов (и десятый, символ конца строки) алгоритм работает, но если введено больше, то, по-видимому, realloc не расширяет объем памяти.
Также выдается ошибка:


Цитата:
ОС Windows инициировала точку останова в lab3.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в lab3.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит lab3.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки

Подскажите, в чем моя ошибка. Два дня проискал в интернете, но ничего толком не нашел.
Вот код:
Код:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <process.h>
#include <stdlib.h>

int main()
{
	int i=0, n=10, b=0;
	char ch;
	/*char* str1; 
	char* str2;*/
	char* str1; 
	char* str2;
	str1=(char*)calloc(n, sizeof(char));
	str2=(char*)calloc(n, sizeof(char));
	system(str1);
	ch=_getch();
	printf("%c", ch);
	while (ch!=13)
	{
		str1[i]=ch;
		n=n+1;
		str1=(char*)realloc(str1, n+1);
		str2=(char*)realloc(str2, n+1);
		i=i+1;
		ch=_getch();
		printf("%c", ch);
	}
	n=strlen(str1);
	if (n%2==0)
	{
	b=n/2; //если в строке четное число символов, то abcdef -> defabc 
	for (i=0; i<b; i=i+1)
		str2[i]=str1[i+b];
	for (i=b; i<n; i=i+1)
		str2[i]=str1[i-b];
	printf ("%s\n", str2);
	free (str1);
	free (str2);
	}
	else
	{
	str1[n]='0'; //если в строке нечетное число символов, то abcde -> deabc (т.е. строка делится на две части, в первой части на 1 символ больше, после чего части меняются местами)
	n=strlen(str1);
	b=n/2;
	for (i=0; i<b; i=i+1)
		str2[i]=str1[i+b];
	for (i=b; i<n; i=i+1)
		str2[i-1]=str1[i-b];
	printf ("%s\n", str2);
	free (str1);
	free (str2);
	}
	system("pause");
	exit(1);

}
Напоминаю, что язык C, а не C++. Среда разработки Microsoft Visual C++ Express
Семоха Валерий вне форума Ответить с цитированием
Старый 04.10.2011, 22:21   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Семоха Валерий

Подскажите, в чем моя ошибка. Два дня проискал в интернете, но ничего толком не нашел.

искать ошибки надо не в интернете, а в программе.
тебе поможет методика поиска и устранения ошибок под названием "отладка", а также некоторые полезные клавиши:

F9 - поставить точку останова
F5 - выполнять программу до ближайшей точки останова
F10 - пошаговое выполнение программы
Rififi вне форума Ответить с цитированием
Старый 05.10.2011, 01:13   #3
Семоха Валерий
 
Регистрация: 04.10.2011
Сообщений: 7
По умолчанию

Код:
	char ch;
	int i=0, n=10, b=0;
	char* str1=(char*)calloc(n, sizeof(char));
	char* str2=(char*)calloc(n, sizeof(char));	
	system(str1);
	ch=_getch();
	printf("%c", ch);
	i=0; n=10;
	while (ch!=13)
	{
		str1[i]=ch;
		n=n+1;
		str1=(char*)realloc((char*)str1, n*sizeof(char));
		str2=(char*)realloc((char*)str2, n*sizeof(char));
		i=i+1;
		ch=_getch();
		printf("%c", ch);
	}
Поискал по форуму, вроде ошибка с realloc.
Переписал его, но ошибка осталась.
Дебагом и точками останова пользуюсь, но я почему в инет полез искать, - потому, что не смог понять причину, из-за которой происходит ошибка.
Спотыкается на realloc. А почему - понять не могу.
У меня проблема в чем, мне нужно сдать много лабораторных на новом языке (до этого изучал Pascal), а времени сесть с книжкой и толком разобраться почти нету, к сожалению. Я не из ленивых, и если бы не такая срочность, с которой нужно делать лабораторные, я бы помощи не просил, сидел бы сам разбирался, меня так родители научили. Но когда сильно прижимает, можно и спросить.
Извиняюсь, что отдалился от темы.
Не нашел я и как правильно написать realloc: в каждой книжке, на каждом форуме по-своему написано. Некоторые ошибки в коде на Си я пока найти не в состоянии.
Семоха Валерий вне форума Ответить с цитированием
Старый 05.10.2011, 11:29   #4
rustx88
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 42
По умолчанию

держи нямку) (всё проверено, робит)

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

int main() {

  char
    n = 1,
    ch = 0,
    * str1,
    * str2;

  str1 = (char *)calloc(n, sizeof(char));

  if (!str1)
    return -1;

  while ((ch = getchar()) != 10) {
    strncat(str1, &ch, 1);
    str1 = (char*)realloc(str1, (n + 1) * sizeof(char));
    str1[n++] = '\0';
  }


  str2 = (char *)calloc(n, sizeof(char));

  if (!str2) {
    if (str1)
      free(str1);
    return -1;
  }

  if (!(--n % 2)) {
    n /= 2;
    strncat(str2, str1 + n, n);
    strncat(str2, str1, n);
  }
  else {
    n = n / 2 + 1;
    strncat(str2, str1 + n, n - 1);
    strncat(str2, str1, n);
  }

  printf("\n\n input string:\n%s \n output string:\n%s", str1, str2);

  if (str1)
    free(str1);
  if (str2)
    free(str2);

  //---
  printf("\n\n\t press [enter] for exit...");
  _flushall();
  getchar();
  return 0;
};

Последний раз редактировалось rustx88; 05.10.2011 в 11:34.
rustx88 вне форума Ответить с цитированием
Старый 05.10.2011, 16:10   #5
Семоха Валерий
 
Регистрация: 04.10.2011
Сообщений: 7
По умолчанию

Спасибо большое, буду разбираться.
Семоха Валерий вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация чисел нормальным распределением Athen Помощь студентам 5 03.04.2015 13:46
генерация случайных чисел с заданным распределением Aladin Общие вопросы C/C++ 6 19.05.2011 22:53
Проблемы с выделением динамической памяти malloc (recalloc) slips Общие вопросы C/C++ 6 29.04.2009 19:27