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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2014, 20:44   #1
Boltina
Пользователь
 
Аватар для Boltina
 
Регистрация: 27.11.2014
Сообщений: 30
По умолчанию Указатели на char

Помогите разобраться в чём ошибка и как можно проиллюстрировать её.
Было написано:
1)
Код:
char *s;
s = "Hello";
s[1] = 'a';
2)
Код:
char *sn;
strcpy (sn,"Hello");
И в 1 и во 2 случае преподаватель указал на ошибку и сказал что так делать нельзя. Надо делать так:
1)
Код:
char *s= "Hello";
s[1] = 'a';
2)
Код:
char *sn = new char [10];
strcpy (sn,"Hello");
Код в принципе работает и так и сяк. В чём конкретно ошибка? И почему? Помогите разобраться, пжлст.
Мяу
Boltina вне форума Ответить с цитированием
Старый 27.11.2014, 20:50   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1) "Hello" - это не char *, а const char *, т.е. этот "массив" менять нельзя. Работать это не должно, но может и в данном случае повезло.
2) память никто не выделял под строку, куда указывает указатель известно только ежу, что будет затирать строкой функция strcpy уже даже и еж не узнает.
pu4koff вне форума Ответить с цитированием
Старый 27.11.2014, 20:53   #3
Boltina
Пользователь
 
Аватар для Boltina
 
Регистрация: 27.11.2014
Сообщений: 30
По умолчанию

А поподробней можно? почему не должно работать? Можно какие нибудь примеры или ссылки? Сам искал, всё облазил, толком и не догнал почему так нельзя.

А при том подходе, который указал препод, всё сработает как надо?
Мяу
Boltina вне форума Ответить с цитированием
Старый 27.11.2014, 22:54   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Про указатели внимательнее читайте в книжках, т.к. всё это от непонимания механизма указателей.
У препода первый пример не сработает. Или он имел ввиду char s[] = "Hello" или лоханулся не меньше вашего, т.к. суть кода 1 в 1.
Раз учите С++, то запомните аббревиатуру UB - это undefined behavior, т.е. неопределенное поведение (в плюсах пригодится). Используется эта аббревиатура для кода, который компилируется, но работу которого никто не гарантирует. Он может быть будет работать, может не будет, может результат работы будет неправильный, неизвестно и всё тут.
Так вот компилятор у вас наверняка какой-нибудь древний и корявый, что на нём это компилится и работает без вылетов.
1) Почему нельзя менять константу я расписывать не буду. Так принято и всё тут. s[1] = 'a'; - фактически именно что изменение константы "Hello", а никакое не изменение буквы в строке/массиве s. s - тупо указатель на кусок памяти, целое число размером в 32 бита (ну, или 64).
2) Память под строку не выделена, указатель никуда не выставлен. Куда strcpy должна скопировать строку? С тем же успехом можно завязать глаза и начать стучать по клавиатуре, думая о программе. Есть вероятность, что в итоге получится то, что нужно.
pu4koff вне форума Ответить с цитированием
Старый 28.11.2014, 10:47   #5
Boltina
Пользователь
 
Аватар для Boltina
 
Регистрация: 27.11.2014
Сообщений: 30
По умолчанию

Спасибо, разобрался. Мяу =)
Мяу
Boltina вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
char * conver (char *somestr) вылетает с exception mosq Общие вопросы C/C++ 2 23.02.2013 02:23
как исправить ошибку 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-const char student101 Помощь студентам 8 01.12.2010 20:45
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17