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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2016, 22:15   #1
klow
Новичок
Джуниор
 
Регистрация: 21.09.2016
Сообщений: 1
По умолчанию Работа с char

Прошу простить за столь глупый вопрос, но не могу разобраться в возникшей проблеме. Пишу вот такой код:
Код:
#include <iostream>	
#include <conio.h>

using namespace std;

char* CoutStr()
{
	char p[20]="Hello";

	return p;
}


int main()
{
	setlocale(LC_ALL, "rus");

	char str[20];

	char *p=str;

	p=CoutStr();

	cout << p;

	_getch();
	return 0;
}
Почему же при выполнении этой программы, я получаю какой-то мусор, а не мое сообщение "Hello"?
И заодно еще, почему вместо строк: char *p=str; p=CoutStr(); я не могу просто написать str=CoutStr()?
klow вне форума Ответить с цитированием
Старый 21.09.2016, 23:47   #2
Максай
Пользователь
 
Аватар для Максай
 
Регистрация: 21.07.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от klow Посмотреть сообщение
Почему же при выполнении этой программы, я получаю какой-то мусор, а не мое сообщение "Hello"?
Потому, что в функции CoutStr() Вы возвращаете указатель на локальную строку, который недействителен за пределами функции и указывать может на любую случайную область памяти, отсюда и мусор.

Для того чтобы правильно вернуть строку из функции Вам нужно либо:
а) выделять для неё память динамически внутри функции (и не забывайте освобождать потом):
Код:
char* CoutStr()
{
    const char hello_str[] = "Hello";
    char* p = new char[20];
    strcpy( p, hello_str );
    return p;
}

// ...

cout << p;
delete[] p; // Строка больше не нужна, освобождаем память.
б) передавать в функцию указатель на заранее выделенный буфер памяти в который будет записываться строка:
Код:
void CoutStr( char* p )
{
    const char hello_str[] = "Hello";
    strcpy( p, hello_str );
    return;
}
в) Хранить строку в доступной вне функции области видимости, глобальной, например:
Код:
char p[]="Hello";

char* CoutStr()
{
    return p;
}
г) Раз уж Вы пишете на C++, а не на голом C, то использовать стандартный класс string вместо С-строк и не заморачиваться с управлением памятью:
Код:
#include <string>

std::string CoutStr()
{
    std::string p = "Hello";
    return p;
}
Цитата:
Сообщение от klow Посмотреть сообщение
И заодно еще, почему вместо строк: char *p=str; p=CoutStr(); я не могу просто написать str=CoutStr()?
Это ограничение унаследовано из языка С. Командой char str[20] вы объявляете массив в статической памяти программы. Так как память статическая, то такой массив может быть инициализирован при объявлении только заранее известными статическими данными. А что вернёт Ваша функция CoutStr() - компилятору на этом этапе неизвестно. Поэтому и нужны две команды.
Впрочем, при использовании одного из вышеуказанных методов вы можете написать:
Код:
char* p = CoutStr(); // Вариант а) или в) - память под C-строку выделяется где-то в другом месте.
или:
Код:
std::string p = CoutStr(); // Вариант г) - класс string сам заботится о выделении памяти и копировании строк.
или даже (при использовании свежего компилятора, поддерживающего стандарт C++11 или более поздний):
Код:
auto p = CoutStr(); // Компилятор сам определит тип переменной p.
Максай вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
char * conver (char *somestr) вылетает с exception mosq Общие вопросы C/C++ 2 23.02.2013 02:23
Работа с символами char (консоль) stas_kovel C# (си шарп) 4 06.11.2012 00:02
как исправить ошибку invalid conversion from const char* to char Ника К Помощь студентам 5 01.06.2012 00:13
Проблема с программой. Нельзя преобразовать тип set of char к char Lasso Помощь студентам 5 07.06.2011 12:03
Работа со строками типа Char Horror Общие вопросы C/C++ 4 02.02.2008 19:45