Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Hellcat
6 / 6 / 2
Регистрация: 27.01.2015
Сообщений: 66
Записей в блоге: 1
#1

Выделение динамической памяти в функции - C++

05.12.2008, 17:20. Просмотров 1567. Ответов 2
Метки нет (Все метки)

Прив.
У меня следующая проблема:
Необходимо выделить память на массив символьных строк, разбив всю программу на функции.

Вот код. При выделении памяти выдаётся ошибка "Null pointer assignment!"
Код
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<alloc.h>

void memA(char**,int,int);
void memF(char**,int);
void vvod(char**,int,int);
void vyvod(char**,int);

void main()
{
	char **mt;
	int n, m, ms;

	clrscr();

	puts("\nEnter number of strings");
	scanf("%d",&n);

	puts("\nEnter max. number of characters in evry string");
	scanf("%d",&m);
	memA(mt,n,m);

	vvod(mt,n,m);

	vyvod(mt,n);

	memF(mt,n);
}


void memA(char **s, int n, int m)
{
	s=(char**)calloc(n,sizeof(char*));
	for(int i=0; i<n; i++)
		*(s+i)=(char*)calloc(m+1,sizeof(char));
}

void memF(char **s,int n)
{
	for(int i=0; i<n; i++)
		free(*(s+i));
	free(s);
}

void vvod(char **s, int n, int m)
{
	puts("\n\nEnter strings:\n");

	for(int i=0; i<n; i++)
	{
		fflush(stdin);
		gets(*(s+i));
		//*(*(s+i)+m)='\0';
	}
}

void vyvod(char **s, int n)
{
	puts("\nThe input text:\n");
	for(int i=0; i<n; i++)
		puts(*(s+i));
	puts("\nThe end!");
	getch();
}
//Причём, если разбить функцию memA на две функции, первая из которых выделяет память на массив указателей, а вторая - на строки, то всё работает =(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2008, 17:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение динамической памяти в функции (C++):

Выделение динамической памяти указателю в локальной функции - C++
Собственно, я не до конца понимаю, что происходит, поэтому прошу если кто может как можно доходчивее пояснить. Упрощенная версия кода...

Выделение динамической памяти размером полученным из функции - C++
Функция ввода размера динамического массива int Kolvo(){ int x; printf(&quot;Введите количество элементов массива числом(от 1 до...

выделение динамической памяти - C++
помогите пожалуйста , нужно написать функцию для ввода новой матрицы, не получается выделить под него память. класс: mymatrix ::...

Выделение динамической памяти - C++
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется динамическая память средсвами new/delete. А именно,...

Выделение динамической памяти - C++
Доброго времени суток! Возник такой вопрос, переделываю программу, где параметры матрицы задавались константами на выделение динамический...

Выделение динамической памяти C++ - C++
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод,...

2
XuTPbIu_MuHTAu
Эксперт С++
2229 / 744 / 10
Регистрация: 27.05.2008
Сообщений: 1,498
05.12.2008, 17:44 #2
Код
void memA(char **s, int n, int m)
{
    s=(char**)calloc(n,sizeof(char*));
    for(int i=0; i<n; i++)
        *(s+i)=(char*)calloc(m+1,sizeof(char));
}
Здесь ошибка. Ты передаешь указатель на char**,выделяешь память под массив
и записываешь в s.однако,s - локальный параметр функции.Он хранится в стеке,и,когда ф-я завершит работу, "пропадет" для остальной программы. Таким образом,память выделяется корректно,однако адрес,по которому она выделена теряется. Возвращай его,вместо того,чтобы передавать как аргумент.
0
Hellcat
6 / 6 / 2
Регистрация: 27.01.2015
Сообщений: 66
Записей в блоге: 1
05.12.2008, 23:29 #3
то есть в мэйне должно быть что-то типа:
mt=memA();
а в функции выделение+return ?

Добавлено через 5 часов 25 минут 24 секунды
А, вот, кажется, я нашёл решение:
Код
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<alloc.h>

char** memA(int, int);
char** memF1(int);
int in_smb(char);
void in_str(char**,int,int);
void out_str(char**,int);

void main()
{
	char **tx;
	int n, m;

	clrscr();

	n=in_smb('N');
	m=in_smb('M');
	tx=memA(n, m);
	in_str(tx,n,m);
	out_str(tx,n);
	tx=memF1(n);

}

int in_smb(char a)
{
	int u, k;
	printf("Enter %c=",a);
	do{
		fflush(stdin);
		k=scanf("%d",&u);
	}while(k!=1);
	return u;
}

char** memA(int N, int M)
{
	char **a;
	a=(char**)calloc(N, sizeof(char*));
	for(int i=0; i<N; i++)
		*(a+i)=(char*)calloc(M+1, sizeof(char));
	return a;
}

void in_str(char** a, int N, int M)
{
	printf("\nEnter the strings.\n");
	fflush(stdin);
	for(int i=0; i<N; i++)
	{
		gets(*(a+i));
		*(*(a+i)+M)='\0';
	}
}

void out_str(char **a, int N)
{
	printf("\n\nThe output text.\n");
	for(int i=0; i<N; i++)
		puts(*(a+i));

	getch();
}

char** memF1(int N)
{
	char **a;
	for(int i=0; i<N; i++)
		free(*(a+i));
	free(a);
  return a;
}
Спасибо за то, что направили меня по нужному пути)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2008, 23:29
Привет! Вот еще темы с ответами:

Выделение динамической памяти - C++
Добрый вечер. Помогите разобраться пожалуйста! Суть такова: есть файл, в нем есть данные, мне надо их оттуда считать и вывести на...

Выделение динамической памяти - C++
Чем int *List = new int; delete List; отличается от обычного массива (int List) ? Нет, я понимаю, что создал динамическую...

Выделение динамической памяти - C++
Доброго времени суток! я начинающий программист, столкнулась с такой проблемой: выделяю память под динамический массив, например ...

Выделение динамической памяти - C++
Всем доброго времени суток. Прошу помочь с задачей. Задача решена, просто нужно переделать её с выделением динамической памяти. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.