Строки в С\С++
|
Новый участник Сообщения: 39 |
При программировании строк в Visual C++ и под Linux я заметил такую штуку:
Если обявить строку как char* pch = "Some_string" то операция *pch = 'A' приводит к ошибкам выполнения. В Linux пишет Segmentation Fail т.е. ошибка обращения к памяти. И в тоже время объявление char pch[] = "Some_string" и операция *pch = 'A' отрабатывает нормально без всяких глюков. Может кто знает где здесь собака зарыта. Только если можно поподробнее. Я думаю это как-то связано с защитой памяти в ОС или что-то в этом духе |
|
Отправлено: 23:13, 05-04-2003 |
Старожил Сообщения: 163
|
Профиль | Отправить PM | Цитировать char pch[] = "Some_string"
мне кажется понятно, почему работает, по той же причине, что и char pch[10] = "Some_string" , только цифры компилятор сам подставляет, т.е. память он выделяет все-таки под переменную, а char* pch = "Some_string" память не выделяет, и хранит значение в другом месте. И хочу заметить что не будет доступно и pch[3]='A' вызовет ту же ошибку. Или вопрос был где именно хранится значение переменной? |
------- Отправлено: 01:43, 06-04-2003 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
info man howto Сообщения: 6958
|
Профиль | Сайт | Отправить PM | Цитировать для строки *char - надо так:
char *point,*psh="Some_string"; .... point=psh; point='A' pch='B' ... point=pch+1 point='A' А что по вашему должна делать команда *pch='A' ? - записать по адресу, указанному в pch значение 'A' ? Т.е по адресу 0x00129 записать 0x100 ? |
------- Отправлено: 09:37, 06-04-2003 | #3 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Вообще-то в C++ строковые литералы имеют тип const char * и char * s = "string literal" оставили только для совместимости со старым кодом. Правильнее будет const char * s = "string literal".
Добавлено: Соответственно объявление char s[] = "string" это объявление обычного массива. |
------- Отправлено: 13:45, 06-04-2003 | #4 |
![]() Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать ruslandh
Вынужден разочаровать, но ты не прав. Цитата:
point = pch+1; //Правомерно, point указывает на второй символ строки. point = 'A'; // pch='B'; * * // А вот так нельзя. Указателю нельзя присваивать неадресные значения. Надо именно: *point = 'A'; *pch = 'B'; //Т.е. по адресам, куда они указывают записываются значения того типа, указателями на которые они являются. Это эквивалентно записи: point[0] = 'A'; pch[0] = 'B'; Другое дело, что как сказал ivank, в первом случае была попытка через указатель изменить значение константы. [s]Исправлено: shurikan, 1:56 7-04-2003[/s] |
||
------- Отправлено: 01:54, 07-04-2003 | #5 |
Пользователь Сообщения: 65
|
Профиль | Сайт | Отправить PM | Цитировать ребята, вас память выделять не учили?
|
Отправлено: 02:38, 07-04-2003 | #6 |
![]() Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать Vaulter
А к данному случаю это отношения не имеет. Под литерал память выделяет компилятор и под указатель тоже. А потом в ячейку указателя кладёт адрес литерала... Извини... |
------- Отправлено: 07:09, 07-04-2003 | #7 |
Модер Сообщения: 1716
|
Профиль | Сайт | Отправить PM | Цитировать shurikan
Ты не совсем прав, что это не имеет отношения к выделению памяти. char* pch = "Some_string" В этом случае в стеке создается pch, в сегменте данных - КОНСТАНТА "Some_string", и pch инициализируется адресом константы. Менять значение указателя можно без проблем, а вот в "Some_string" писать нельзя именно из-за того, что под нее так выделена память. char pch[] = "Some_string" На стеке создается массив pch[] и его элементы инициализируются значениями из строковой константы (в принципе, компилятор мог бы, как и в прошлый раз, выделить место с сегменте данных, а после создания pch[] написать какой-нибудь memcpy, если эта константа много где встречается и так будет компактнее). То есть, "Some_string" как таковой может и вовсе не существовать. Естественно, в pch[] можно писать. Цитата:
x = "x2"; x = "x3"; и т.д. |
|
------- Отправлено: 08:23, 07-04-2003 | #8 |
![]() Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать vasketsov
Верно для локальных переменных, а если они глобальные? Для них память выделяется в сегменте данных. А результат выражения "x2" - есть адрес, так что это адресное выражение. |
------- Отправлено: 08:39, 07-04-2003 | #9 |
Модер Сообщения: 1716
|
Профиль | Сайт | Отправить PM | Цитировать shurikan
Цитата:
Цитата:
WCHAR x[] = L"sss"; то L"sss" - никакое не "адресное выражение", а параметр инициализации x[]. То есть, у L"sss" может вовсе не быть адреса. |
||
------- Отправлено: 21:41, 07-04-2003 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - Трей в 2 строки | .ExeRun | Microsoft Windows 7 | 2 | 31-12-2010 01:22 | |
.NET - перечисляемые строки | Surround | Программирование и базы данных | 3 | 05-10-2009 19:57 | |
MySQL - Автозамена строки из другой строки - trigger? procedure ? | BugZZ | Программирование и базы данных | 0 | 18-09-2009 09:51 | |
строки в С++ | rodman | Программирование и базы данных | 7 | 02-07-2004 12:54 |
|