Строки в С\С++
-
shurikan
Re: Строки в С\С++
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";
и т.д.
Ты не совсем прав, что это не имеет отношения к выделению памяти.
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";
и т.д.
-
shurikan
Re: Строки в С\С++
vasketsov
Верно для локальных переменных, а если они глобальные?
Для них память выделяется в сегменте данных.
А результат выражения "x2" - есть адрес, так что это адресное выражение.
Верно для локальных переменных, а если они глобальные?
Для них память выделяется в сегменте данных.
А результат выражения "x2" - есть адрес, так что это адресное выражение.
-
shurikan
Re: Строки в С\С++
shurikan
Цитата:
Для них память выделяется в сегменте данных.
В данном случае вероятнее всего, но теоретически - может и в куче. Например, если нетривиальный конструктор.
Цитата:
А результат выражения "x2" - есть адрес
Опять же, если я в функции напишу
WCHAR x[] = L"sss";
то L"sss" - никакое не "адресное выражение", а параметр инициализации x[]. То есть, у L"sss" может вовсе не быть адреса.
Цитата:
Для них память выделяется в сегменте данных.
В данном случае вероятнее всего, но теоретически - может и в куче. Например, если нетривиальный конструктор.
Цитата:
А результат выражения "x2" - есть адрес
Опять же, если я в функции напишу
WCHAR x[] = L"sss";
то L"sss" - никакое не "адресное выражение", а параметр инициализации x[]. То есть, у L"sss" может вовсе не быть адреса.
-
netmax
Re: Строки в С\С++
Crew
> Или вопрос был где именно хранится значение переменной?
Да вопрос как раз в этом то и заключался, то что будут ошибки так это я сам знаю. Почему?
ruslandh
А что по вашему должна делать команда
*pch='A' ? - записать по адресу, указанному в pch значение 'A' ? Т.е по адресу 0x00129 записать 0x100 ?
Фишка в том что *pch - разименование указателя. Т.е. 'A' будет записано в ячейку, адрес которой содержится в pch.
Vaulter
Так если объявление char* pch = "Some_String"; не выделяет память то куда же она будет записана. Ведь вывести я ее могу?
> Или вопрос был где именно хранится значение переменной?
Да вопрос как раз в этом то и заключался, то что будут ошибки так это я сам знаю. Почему?
ruslandh
А что по вашему должна делать команда
*pch='A' ? - записать по адресу, указанному в pch значение 'A' ? Т.е по адресу 0x00129 записать 0x100 ?
Фишка в том что *pch - разименование указателя. Т.е. 'A' будет записано в ячейку, адрес которой содержится в pch.
Vaulter
Так если объявление char* pch = "Some_String"; не выделяет память то куда же она будет записана. Ведь вывести я ее могу?
-
Vaulter
-
Vaulter
Re: Строки в С\С++
Знаете в чем еще фишка. Если сделать Active Confoguration не Debug а Release все работает. Вообще какая-то фигня


-
netmax
-
Vaulter
Re: Строки в С\С++
Crew
Меня очень ломает разбираться в MFC, потому давайте вместе.
Какие прототипы есть у вызова AddString? То есть, что можно передать этой функции (без учета приведения типа непосредственно внутри скобочек)?
Есть мысль, что AddString просто берет указатель на строку, если у тебя строчка в сегменте данных, то работать будет, если через CString - то ты отдаешь в лист указатель на CString-овую строку - при прибитии его тебе программа вполне обосновано дает по рукам, так как адрес, сохраненный в твоем листе, уже толком никуда не указывает. Аналогично и с массивом, пока не убьешь его, все будет работать.
Vaulter
Цитата:
в Debug режиме, VC запускает прогу в своей куче
Не понял нифига.
Я собрал проект как Debug.
Закрыл к чертям MSVC.
Запустил собранный проект.
Откуда он возьмет кучу MSVC?
Меня очень ломает разбираться в MFC, потому давайте вместе.
Какие прототипы есть у вызова AddString? То есть, что можно передать этой функции (без учета приведения типа непосредственно внутри скобочек)?
Есть мысль, что AddString просто берет указатель на строку, если у тебя строчка в сегменте данных, то работать будет, если через CString - то ты отдаешь в лист указатель на CString-овую строку - при прибитии его тебе программа вполне обосновано дает по рукам, так как адрес, сохраненный в твоем листе, уже толком никуда не указывает. Аналогично и с массивом, пока не убьешь его, все будет работать.
Vaulter
Цитата:
в Debug режиме, VC запускает прогу в своей куче
Не понял нифига.
Я собрал проект как Debug.
Закрыл к чертям MSVC.
Запустил собранный проект.
Откуда он возьмет кучу MSVC?
-
shurikan
Re: Строки в С\С++
Vaulter
Когда я выше упоминал, что к выделению памяти этот случай не имеет отношения, я имел ввиду динамическое выделение памяти. Слово "динамическое" я опустил, за что справедливо получил по шапке от vasketsov-а. Так вот, если память выделяется динамически с помощью всяких там new, malloc и им подобных, то память нужно освобождать, а если (как написано)
Код:
, то за это отвечает компилятор и об освобождении беспокоиться не нужно.
Когда я выше упоминал, что к выделению памяти этот случай не имеет отношения, я имел ввиду динамическое выделение памяти. Слово "динамическое" я опустил, за что справедливо получил по шапке от vasketsov-а. Так вот, если память выделяется динамически с помощью всяких там new, malloc и им подобных, то память нужно освобождать, а если (как написано)
Код:
Код: Выделить всё
char *pch = "Some string";, то за это отвечает компилятор и об освобождении беспокоиться не нужно.
-
Vaulter
Re: Строки в С\С++
VBMUSTDIE
скажу всетаки секрет один:
char* a="something"; "а" вообще то будет распознана компилятором как строковая константа:
const char a[9]; поэтому и нельзя a[4]='a';
а вот
char a[]="something"; можно. потому как будет "а" будет как
char a[9];
скажу всетаки секрет один:
char* a="something"; "а" вообще то будет распознана компилятором как строковая константа:
const char a[9]; поэтому и нельзя a[4]='a';
а вот
char a[]="something"; можно. потому как будет "а" будет как
char a[9];