Показать полную графическую версию : Строки в С\С++
Потому что это лажа.
Вот и читай после этого умные книжки
vasketsov
Преложенный код вывел
%МB_-ьd
при добавлении слова static, заработало, но в цикле использовать переменную не могу,
потому что
static char x[8]="йцукен";
m_List.AddString(x);
strcpy(x,"2йцукен");
m_List.AddString(x);
выведет на экран два раза
2йцукен
а заранее предсказать количество строк в списке я не могу, не делать же массив глобальных переменных?
Я правильно понял идею с глобальными пременными?
если вылетит - придется либо глобальные строчки использовать, либо руками память выделять/освобождать
я пытаюсь понять где это сделать руками (с радостью бы сделал),но пока не знаю где именно он меня не пошлют с моими попытками высвободить память:(
glassMonk
11-04-2003, 03:15
Так что я могу положить сколь угодно большое число в
char *point="asdfasdfsad....n"
это както небезопасно получается.
Меня почемуто это больше всего тревожит.
А не обрашение к ниму.
Исправлено: glassMonk, 3:25 11-04-2003
vasketsov
11-04-2003, 07:43
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);
vasketsov
если вылетит - придется либо глобальные строчки использовать, либо руками память выделять/освобождать (освобождать можно при наступлении события удаления элемента, вроде там такое есть, по крайней мере винда такое сообщение шлет).
Так получается при объявлении
char* pch = "Some_String"
память не выделяется?
Но если попробовать вести строку в ЛЮБОМ месте программы то она выведится
printf("%s\n", pch);
Как так память не выделяется а функция выводит?
vasketsov
Зачем мне это?. Мне строки днамически создавать надо.
а так и AddString("Some string"); прекрасно работает.
Мне это вообще зачем нужно - это достаточно большая база с вопросами, где выбрав нужный ответ, нажав на кнопку с текстом ответа, уменьшаем время, затрачиваемое на прохождение теста. Вопросы берутся из базы, в виде переменных -естественно.
VBMUSTDIE
Я так для себя упростил, что записалась эта строка куда-то в ЕХЕ, компилятор делает вид что это обычный адрес, однако разрешает только читать из самого себя и только столько, сколько при компиляции отведено, и любые попытки поменять значения воспринимает как попытки поменять сам ЕХЕ.
Crew
Сделай глобальный CList (или как там аналог std::list называется?) строк и заполняй его динамически по мере надобности.
Вот и читай после этого умные книжки
Умные читай, лажу не надо.
и любые попытки поменять значения воспринимает как попытки поменять сам ЕХЕ. Не совсем так. компилятор воспринемает попытку изменить часть такой "строки" как просто замену чего-то по какому-то адресу. Другое дело, что он имеет полное право поместить строковой литерал в конcтантную область памяти, где ты по понятным причинам ничего не сможешь поменять.
vasketsov
11-04-2003, 23:10
VBMUSTDIE
Так получается при объявлении
char* pch = "Some_String"
память не выделяется?
Наиболее вероятно, что строка будет помещена в сегменте данных, а переменная - в стеке (если локальная). Считать это выделением памяти или нет - решать вам. Я же имел в виду что-нибудь типа new.
Но если попробовать вести строку в ЛЮБОМ месте программы то она выведится
printf("%s\n", pch);
Как так память не выделяется а функция выводит?
1) В printf передается адрес строки "%s\n", тут ситуация с памятью такая же, как и выше.
2) Если только %s, то нетрудно видеть, чтоб можно вывести этот текст без дополнительного выделения памяти даже на стеке. Выводим текст до %s, потом аргумент, потом снова текст до %s, снова аргумент, и т.д.
3) Если есть %d и т.п., то сложнее, но память может выделиться внутри printf (особенно если ей на вход отдается свой нетривиальный объект) и освободиться там же.
glassMonk
Так что я могу положить сколь угодно большое число в
char *point="asdfasdfsad....n"
это както небезопасно получается.
А почему это может быть не безопастным?
glassMonk
13-04-2003, 07:23
Ответ оказался в цитате, я догадался сам.
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;
почему после этого в буфере пусто?
shurikan
03-11-2003, 18:57
Guest
Это что, попытка превратить C-строку в Pascal-строку?
Pascal-строка (короткая) содержит длину в одном (первом) байте. А размер данных типа int зависит от ОС и компилятора - м.б. 2 байта, а м.б *- 4. В любом случае старшие байты переменной len, скорее всего нулевые. А что такое age?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.