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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 12:21   #1
vvsmvps
 
Регистрация: 20.05.2011
Сообщений: 6
По умолчанию Некорректная работа, но ошибок нет

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

Код:
char **keyWords = new char*[57];

//+++++++++++++++++++++++++Prototypes++++++++++++++++++++++++++
void readKeyWords();

//+++++++++++++++++++++++++Main++++++++++++++++++++++++++++++++
void main()
{
	clrscr();
	readKeyWords();
	delete [] keyWords;
	getch();
}

//++++++++++++++++++++++++++Functions++++++++++++++++++++++++++
void readKeyWords()
{
	unsigned i=0;
	FILE *fkey;

	fkey = fopen("c:\keywords.txt","r");

	while(!feof(fkey))
	{
		fgets(keyWords[i],20,fkey);
		i++;
	}
	fclose(fkey);
}
vvsmvps вне форума Ответить с цитированием
Старый 23.06.2011, 14:26   #2
fenryr
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 28
По умолчанию

Код:
char **keyWords = new char*[57];
Первая ошибка сразу видна - память под массив указателей выделяется, но память на строку по каждому указателю - нет.

Код:
keyWords[i]  = new char[21];
fgets(keyWords[i],20,fkey);
fenryr вне форума Ответить с цитированием
Старый 23.06.2011, 15:24   #3
vvsmvps
 
Регистрация: 20.05.2011
Сообщений: 6
По умолчанию

Вау, спасибо. А есть ещё ошибки?

P.S. Просветите меня, есть ли разница между вот этим:
Код:
char a[12][10];
и вот этим:
Код:
char **a;
?

Обязательно ли второе - массив указателей? Можно ли обычные массивы так объявлять?
vvsmvps вне форума Ответить с цитированием
Старый 23.06.2011, 16:12   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

В первом случаи это статический двойной массив, а во втором это объявления указателя на указатель.

Цитата:
Сообщение от vvsmvps Посмотреть сообщение
Обязательно ли второе - массив указателей?
Не обязательно. Можно статически выделить память.
Цитата:
Сообщение от vvsmvps Посмотреть сообщение
Можно ли обычные массивы так объявлять?
Что значит "обычные" массивы, а есть ли "необычные" массивы ?

Код:
char **keyWords = new char*[57];
Здесь просто массив указателей. Т.е. 57 строчек будущих.

А потом надо
Код:
for (int i=0; i<57; i++) keyWorlds[i] = new char [N];
Выделить память для каждой строчки размером N. А потом уже можешь записывать в эти строки текст.

Последний раз редактировалось An1ka; 23.06.2011 в 16:19.
An1ka вне форума Ответить с цитированием
Старый 23.06.2011, 18:47   #5
vvsmvps
 
Регистрация: 20.05.2011
Сообщений: 6
По умолчанию

Я имею в виду, есть ли принципиальная разница в использовании между статическим двумерным массивом и таким: int **a. Как вы говорите "объявление указателя на указатель". Но ведь, как я понимаю, так можно и массив объявить? Или тут разница в распределении памяти?
vvsmvps вне форума Ответить с цитированием
Старый 23.06.2011, 18:56   #6
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от vvsmvps Посмотреть сообщение
Я имею в виду, есть ли принципиальная разница в использовании между статическим двумерным массивом и таким: int **a. Как вы говорите "объявление указателя на указатель". Но ведь, как я понимаю, так можно и массив объявить? Или тут разница в распределении памяти?
Да. Разница в способе выделения памяти. Либо статически - память автоматически освободится при выходе из области видимости, либо динамически - будет "жить", пока не будет освобождена через delete.
Еще статически выделенные блоки памяти должны быть константного размера (их размер известен еще до компиляции и не меняется в процессе выполнения программы).
А динамически выделенные блоки памяти могут иметь произвольный размер и их размер может определяться в процессе выполнения программы.

Последний раз редактировалось An1ka; 23.06.2011 в 19:05.
An1ka вне форума Ответить с цитированием
Старый 26.06.2011, 11:18   #7
vvsmvps
 
Регистрация: 20.05.2011
Сообщений: 6
По умолчанию

Подниму тему.
Во время очистки памяти я пишу

delete [] keyWords;

Очистится ли вся память под массив или же нужно так же в цикле очищать?
vvsmvps вне форума Ответить с цитированием
Старый 26.06.2011, 12:06   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

new выделяет память. И на каждый new требуется delete.
В Вашем случае нужно в цикле: delete[] keyWorlds[i];
И итоговый: delete[] keyWords.

Последний раз редактировалось EUGY; 26.06.2011 в 12:09.
EUGY вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректная работа WPF _-Re@l-_ WPF, UWP, WinRT, XAML 0 19.04.2011 16:05
Ошибок нет ,но вывод неправельный,исправте!!! Drago56 Общие вопросы C/C++ 2 20.12.2010 17:14
Некорректная работа Ucoz.ru docbrain WordPress и другие CMS 7 31.03.2010 11:26
Правильно или нет вот в чём вопрос но ошибок нет... Alexcool Помощь студентам 2 10.01.2010 13:55
Посмотрите кто-нибудь нет ли ошибок?! wepoTWR Помощь студентам 0 01.12.2009 18:10