Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Строки в С\С++

Ответить
Настройки темы
Строки в С\С++

Новый участник


Сообщения: 39
Благодарности: 0

Профиль | Отправить PM | Цитировать


При программировании строк в Visual C++ и под Linux я заметил такую штуку:
Если обявить строку как
char* pch = "Some_string" то операция
*pch = 'A' приводит к ошибкам выполнения. В Linux пишет Segmentation Fail т.е. ошибка обращения к памяти. И в тоже время объявление
char pch[] = "Some_string"
и операция
*pch = 'A' отрабатывает нормально без всяких глюков. Может кто знает где здесь собака зарыта. Только если можно поподробнее. Я думаю это как-то связано с защитой памяти в ОС или что-то в этом духе

Отправлено: 23:13, 05-04-2003

 

Старожил


Сообщения: 163
Благодарности: 0

Профиль | Отправить PM | Цитировать


char pch[] = "Some_string"
мне кажется понятно, почему работает, по той же причине, что и char pch[10] = "Some_string" , только цифры компилятор сам подставляет, т.е. память он выделяет все-таки под переменную,
а
char* pch = "Some_string" память не выделяет, и хранит значение в другом месте. И хочу заметить что не будет доступно и pch[3]='A' вызовет ту же ошибку.
Или вопрос был где именно хранится значение переменной?

-------
"Сколь бы сложной ни казалась проблема на первый взгляд, она, если правильно к ней подойти, окажется еще более сложной" - Пол Андерсон


Отправлено: 01:43, 06-04-2003 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ruslandh

info man howto


Сообщения: 6958
Благодарности: 384

Профиль | Сайт | Отправить 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
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Вообще-то в C++ строковые литералы имеют тип const char * и char * s = "string literal" оставили только для совместимости со старым кодом. Правильнее будет const char * s = "string literal".

Добавлено:

Соответственно объявление char s[] = "string" это объявление обычного массива.

-------
http://ivank.ru


Отправлено: 13:45, 06-04-2003 | #4


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


ruslandh
Вынужден разочаровать, но ты не прав.
Цитата:
для строки *char - надо так:

char *point,*psh="Some_string";

....
point=psh;
point='A'
pch='B'
...
point=pch+1
point='A'


А что по вашему должна делать команда
*pch='A' ? - записать по адресу, указанному в pch значение 'A' ? Т.е по адресу 0x00129 записать 0x100 ?
point = pch; //Правомерно, оба указателя ссылаются на один и тот же адрес.
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]

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 01:54, 07-04-2003 | #5


Пользователь


Сообщения: 65
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


ребята, вас память выделять не учили?

Отправлено: 02:38, 07-04-2003 | #6


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


Vaulter
А к данному случаю это отношения не имеет. Под литерал память выделяет компилятор и под указатель тоже. А потом в ячейку указателя кладёт адрес литерала... Извини...

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 07:09, 07-04-2003 | #7


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


shurikan
Ты не совсем прав, что это не имеет отношения к выделению памяти.

char* pch = "Some_string"

В этом случае в стеке создается pch, в сегменте данных - КОНСТАНТА "Some_string", и pch инициализируется адресом константы. Менять значение указателя можно без проблем, а вот в "Some_string" писать нельзя именно из-за того, что под нее так выделена память.

char pch[] = "Some_string"

На стеке создается массив pch[] и его элементы инициализируются значениями из строковой константы (в принципе, компилятор мог бы, как и в прошлый раз, выделить место с сегменте данных, а после создания pch[] написать какой-нибудь memcpy, если эта константа много где встречается и так будет компактнее). То есть, "Some_string" как таковой может и вовсе не существовать. Естественно, в pch[] можно писать.


Цитата:
Указателю нельзя присваивать неадресные значения.
pchar x = "x1";
x = "x2";
x = "x3";
и т.д.

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 08:23, 07-04-2003 | #8


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


vasketsov
Верно для локальных переменных, а если они глобальные?
Для них память выделяется в сегменте данных.
А результат выражения "x2" - есть адрес, так что это адресное выражение.

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 08:39, 07-04-2003 | #9


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


shurikan
Цитата:
Для них память выделяется в сегменте данных.
В данном случае вероятнее всего, но теоретически - может и в куче. Например, если нетривиальный конструктор.

Цитата:
А результат выражения "x2" - есть адрес
Опять же, если я в функции напишу

WCHAR x[] = L"sss";

то L"sss" - никакое не "адресное выражение", а параметр инициализации x[]. То есть, у L"sss" может вовсе не быть адреса.

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 21:41, 07-04-2003 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Строки в С\С++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Трей в 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




 
Переход