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

Компьютерный форум 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 | Цитировать


Цитата:
Потому что это лажа.
Вот и читай после этого умные книжки
vasketsov
Преложенный код вывел
%МB_-ьd

при добавлении слова static, заработало, но в цикле использовать переменную не могу,
потому что
Код: Выделить весь код
static char x[8]="йцукен"; 
m_List.AddString(x);
strcpy(x,"2йцукен");
m_List.AddString(x);
выведет на экран два раза
2йцукен
а заранее предсказать количество строк в списке я не могу, не делать же массив глобальных переменных?

Я правильно понял идею с глобальными пременными?
Цитата:
если вылетит - придется либо глобальные строчки использовать, либо руками память выделять/освобождать
я пытаюсь понять где это сделать руками (с радостью бы сделал),но пока не знаю где именно он меня не пошлют с моими попытками высвободить память

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


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



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

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

glassMonk


Сообщения: n/a

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


Так что я могу положить сколь угодно большое число в
char *point="asdfasdfsad....n"
это както небезопасно получается.
Меня почемуто это больше всего тревожит.
А не обрашение к ниму.

[s]Исправлено: glassMonk, 3:25 11-04-2003[/s]

Отправлено: 03:15, 11-04-2003 | #22


Модер


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

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


Crew
Если AddString действительно может принимать pchar, можешь сделать так, вроде противопоказаний нет:

Цитата:
//глобально
#define TXT1 "Text1"
#define TXT2 "Text2"
#define TXT3 "Text3"


//локально
pchar p = TXT1;
m_List.AddString(p);

pchar p = TXT2;
m_List.AddString(p);

pchar p = TXT3;
m_List.AddString(p);

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


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


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


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

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


vasketsov
Цитата:
если вылетит - придется либо глобальные строчки использовать, либо руками память выделять/освобождать (освобождать можно при наступлении события удаления элемента, вроде там такое есть, по крайней мере винда такое сообщение шлет).
Так получается при объявлении
char* pch = "Some_String"
память не выделяется?
Но если попробовать вести строку в ЛЮБОМ месте программы то она выведится
printf("%s\n", pch);
Как так память не выделяется а функция выводит?

Отправлено: 12:44, 11-04-2003 | #24


Старожил


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

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


vasketsov
Зачем мне это?. Мне строки днамически создавать надо.
а так и AddString("Some string"; прекрасно работает.
Мне это вообще зачем нужно - это достаточно большая база с вопросами, где выбрав нужный ответ, нажав на кнопку с текстом ответа, уменьшаем время, затрачиваемое на прохождение теста. Вопросы берутся из базы, в виде переменных -естественно.
VBMUSTDIE
Я так для себя упростил, что записалась эта строка куда-то в ЕХЕ, компилятор делает вид что это обычный адрес, однако разрешает только читать из самого себя и только столько, сколько при компиляции отведено, и любые попытки поменять значения воспринимает как попытки поменять сам ЕХЕ.

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


Отправлено: 22:15, 11-04-2003 | #25


редкий гость


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

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


Crew
Сделай глобальный CList (или как там аналог std::list называется?) строк и заполняй его динамически по мере надобности.

Цитата:
Вот и читай после этого умные книжки
Умные читай, лажу не надо.

Цитата:
и любые попытки поменять значения воспринимает как попытки поменять сам ЕХЕ.
Не совсем так. компилятор воспринемает попытку изменить часть такой "строки" как просто замену чего-то по какому-то адресу. Другое дело, что он имеет полное право поместить строковой литерал в конcтантную область памяти, где ты по понятным причинам ничего не сможешь поменять.

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


Отправлено: 22:40, 11-04-2003 | #26


Модер


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

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


VBMUSTDIE
Цитата:
Так получается при объявлении
char* pch = "Some_String"
память не выделяется?
Наиболее вероятно, что строка будет помещена в сегменте данных, а переменная - в стеке (если локальная). Считать это выделением памяти или нет - решать вам. Я же имел в виду что-нибудь типа new.

Цитата:
Но если попробовать вести строку в ЛЮБОМ месте программы то она выведится
printf("%s\n", pch);
Как так память не выделяется а функция выводит?
1) В printf передается адрес строки "%s\n", тут ситуация с памятью такая же, как и выше.
2) Если только %s, то нетрудно видеть, чтоб можно вывести этот текст без дополнительного выделения памяти даже на стеке. Выводим текст до %s, потом аргумент, потом снова текст до %s, снова аргумент, и т.д.
3) Если есть %d и т.п., то сложнее, но память может выделиться внутри printf (особенно если ей на вход отдается свой нетривиальный объект) и освободиться там же.

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


Отправлено: 23:10, 11-04-2003 | #27


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


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

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


glassMonk
Цитата:
Так что я могу положить сколь угодно большое число в
char *point="asdfasdfsad....n"
это както небезопасно получается.
А почему это может быть не безопастным?


Отправлено: 23:31, 11-04-2003 | #28

glassMonk


Сообщения: n/a

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


Ответ оказался в цитате, я догадался сам.

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


Аватара для Guest

Guest


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


int len=strlen(name);
char* buffer = new char[2*sizeof(int)+len];
memcpy(buffer,&len,sizeof(int));
memcpy(buffer+sizeof(int),name,len);
memcpy(buffer+sizeof(int)+len,&age,sizeof(int));
return buffer;


почему после этого в буфере пусто?

Отправлено: 18:09, 03-11-2003 | #30



Компьютерный форум 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




 
Переход