@kyklaed

Динамическое выделение памяти для массива, в чем ошибка?

Привет, переделываю пример из книги по СИ . в задании сказано определить самую длинную строку введенную с клавиатуры и вывести на экран. Проблема в том что видимо где то не верно работаю с указателем мне так кажется . почему то больше чем 24 символа не принимает, первый раз вроде делает увеличение памяти если изначально выделенная закончилась . но когда вводишь вторую строку то перераспределение не работает и программа завершается . не могу понять в чем я ошибся
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int getline(char *p1,char *p2);
void copy (char *p2,char *p1);

int main(){
	char *p1,*p2;
	int len;
	int max;
	int n =100;
	p1 = (char*)malloc(n * sizeof(char));
	p2 = (char*)malloc(n * sizeof(char));
	
	while((len=getline(p1,p2)) > 0){
		
		if (len>max){
			max=len;
			copy(p2,p1);
		}
	}
	if (max>0){
		int i;
		printf("%s",p2);

	}
	free(p1);
	free(p2);
	return 0;
}

int getline(char *p1,char *p2){
	int c, i;
	for (i=0;  (c=getchar()) != EOF && c != '\n'; ++i){
		if (i==10){
			printf("%s\n","UP1");
			p1 = (char*)realloc(p1, 2 * sizeof(char));
			p2 = (char*)realloc(p2, 2 * sizeof(char));
			printf("%s\n","UP2");	
		}
		printf("c[%d] = %c\n",i,c);
		*(p1+i)=c;
	}
	if (c == '\n'){
		*(p1+i) = c;
		++i;
	}
	*(p1+i)='\0';
	return i;
}

void copy(char *p2, char *p1){
	int i;
	i=0;
	
	while ((*(p2+i) = *(p1+i)) != '\0'){
		++i;
	}
	free(p1);
}
  • Вопрос задан
  • 460 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
1) Realloc принимает размер ожидаемой памяти, ты суёшь ему просто 2.
2) После этого ты пишешь в какую-то рандомную память.
3) Ты в функцию передаешь одинарный указатель. Чтобы это работало и указатель менялся, надо передавать двойной. То есть, после выхода из функции, если у тебя был реаллок, в твоём буфере всё равно мусор.
4) Перевыделять каждый раз второй буфер не нужно.
5) копировать из одного буфера в другой не нужно. Достаточно буферы свопнуть(поменять местами через третью переменную).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы