Форум программистов, компьютерный форум CyberForum.ru

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

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

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

05.12.2008, 17:20. Просмотров 1354. Ответов 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 на две функции, первая из которых выделяет память на массив указателей, а вторая - на строки, то всё работает =(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2008, 17:20     Выделение динамической памяти в функции
Посмотрите здесь:

C++ Матрица, выделение динамической памяти
C++ Выделение динамической памяти указателю в локальной функции
C++ Выделение динамической памяти
Выделение динамической памяти C++ C++
C++ выделение динамической памяти
Выделение динамической памяти C++
C++ Выделение динамической памяти
C++ Выделение динамической памяти
Выделение динамической памяти C++
Выделение динамической памяти размером полученным из функции C++
Выделение и очистка динамической памяти C++
Выделение и использование динамической памяти C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
2221 / 736 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
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 - локальный параметр функции.Он хранится в стеке,и,когда ф-я завершит работу, "пропадет" для остальной программы. Таким образом,память выделяется корректно,однако адрес,по которому она выделена теряется. Возвращай его,вместо того,чтобы передавать как аргумент.
Hellcat
Сообщений: n/a
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;
}
Спасибо за то, что направили меня по нужному пути)
Yandex
Объявления
05.12.2008, 23:29     Выделение динамической памяти в функции
Ответ Создать тему
Опции темы

Текущее время: 22:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru