Строки в С\С++

Аватара пользователя
shurikan

Re: Строки в С\С++

Сообщение shurikan »

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";

и т.д.
Аватара пользователя
shurikan

Re: Строки в С\С++

Сообщение shurikan »

vasketsov

Верно для локальных переменных, а если они глобальные?

Для них память выделяется в сегменте данных.

А результат выражения "x2" - есть адрес, так что это адресное выражение.
Аватара пользователя
shurikan

Re: Строки в С\С++

Сообщение shurikan »

shurikan


Цитата:



Для них память выделяется в сегменте данных.



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




Цитата:



А результат выражения "x2" - есть адрес



Опять же, если я в функции напишу



WCHAR x[] = L"sss";



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

Re: Строки в С\С++

Сообщение netmax »

Crew

> Или вопрос был где именно хранится значение переменной?

Да вопрос как раз в этом то и заключался, то что будут ошибки так это я сам знаю. Почему?



ruslandh

А что по вашему должна делать команда

*pch='A' ? - записать по адресу, указанному в pch значение 'A' ? Т.е по адресу 0x00129 записать 0x100 ?

Фишка в том что *pch - разименование указателя. Т.е. 'A' будет записано в ячейку, адрес которой содержится в pch.

Vaulter

Так если объявление char* pch = "Some_String"; не выделяет память то куда же она будет записана. Ведь вывести я ее могу?
Аватара пользователя
Vaulter

Re: Строки в С\С++

Сообщение Vaulter »

VBMUSTDIE

освободить то ее надо потом )

хотя это будут Memory leaks
Аватара пользователя
Vaulter

Re: Строки в С\С++

Сообщение Vaulter »

Знаете в чем еще фишка. Если сделать Active Confoguration не Debug а Release все работает. Вообще какая-то фигня

Изображение
Аватара пользователя
netmax

Re: Строки в С\С++

Сообщение netmax »

VBMUSTDIE

в Debug режиме, VC запускает прогу в своей куче.
Аватара пользователя
Vaulter

Re: Строки в С\С++

Сообщение Vaulter »

Crew

Меня очень ломает разбираться в MFC, потому давайте вместе.



Какие прототипы есть у вызова AddString? То есть, что можно передать этой функции (без учета приведения типа непосредственно внутри скобочек)?



Есть мысль, что AddString просто берет указатель на строку, если у тебя строчка в сегменте данных, то работать будет, если через CString - то ты отдаешь в лист указатель на CString-овую строку - при прибитии его тебе программа вполне обосновано дает по рукам, так как адрес, сохраненный в твоем листе, уже толком никуда не указывает. Аналогично и с массивом, пока не убьешь его, все будет работать.



Vaulter


Цитата:



в Debug режиме, VC запускает прогу в своей куче



Не понял нифига.



Я собрал проект как Debug.

Закрыл к чертям MSVC.

Запустил собранный проект.

Откуда он возьмет кучу MSVC?
Аватара пользователя
shurikan

Re: Строки в С\С++

Сообщение shurikan »

Vaulter

Когда я выше упоминал, что к выделению памяти этот случай не имеет отношения, я имел ввиду динамическое выделение памяти. Слово "динамическое" я опустил, за что справедливо получил по шапке от vasketsov-а. Так вот, если память выделяется динамически с помощью всяких там new, malloc и им подобных, то память нужно освобождать, а если (как написано)

Код:

Код: Выделить всё

char *pch = "Some string";

, то за это отвечает компилятор и об освобождении беспокоиться не нужно.
Аватара пользователя
Vaulter

Re: Строки в С\С++

Сообщение Vaulter »

VBMUSTDIE



скажу всетаки секрет один:

char* a="something"; "а" вообще то будет распознана компилятором как строковая константа:

const char a[9]; поэтому и нельзя a[4]='a';



а вот

char a[]="something"; можно. потому как будет "а" будет как

char a[9];
Ответить

Вернуться в «Программирование и базы данных»