Здравствуйте, гость ( Вход | Регистрация )
TheJax | Дата 14.1.2016, 18:24 |
lanz, все понятно. Спасибо Вам огромное! | |
lanz | Дата 14.1.2016, 18:20 |
Цитата массив "а" создается на стеке и выходя за пределы функции данные ( массив "а" ) уничтожается В целом да. Вообще это детали реализации где он создается, более важно что время его жизни ограничено областью функции, т.к. это локальная переменная. |
|
TheJax | Дата 14.1.2016, 18:15 |
lanz, дошло, спасибо Вам )). Касательно Ваших двух примеров. А почему во втором случае возвращается мусор? Из-за того, что, массив "а" создается на стеке и выходя за пределы функции данные ( массив "а" ) уничтожается и указатель указывает на мусор ? Так ? |
|
lanz | Дата 14.1.2016, 18:03 |
На практике разница такая:
http://rextester.com/OZME60022 Цитата строка же константная Нет, она же char* Процитирую первую ссылку: Цитата it turns into an unnamed, static array of characters, and this unnamed array may be stored in read-only memory, and which therefore cannot necessarily be modified. In an expression context, the array is converted at once to a pointer, as usual (see section 6), so the second declaration initializes p to point to the unnamed array's first element. Some compilers have a switch controlling whether string literals are writable or not (for compiling old code), and some may have options to cause string literals to be formally treated as arrays of const char (for better error catching). may, may, may т.е. это не обязательно. |
|
TheJax | Дата 14.1.2016, 17:58 |
lanz, да, извиняюсь, чушь написал. Имелось ввиду следующее. В первой строке ( char *ptr="Hello"; ) создается константная строка и указатель на константную строку ( "Hello" ). Похожа ли по смыслу вторая запись, т.е. ,что, есть константная строка, и есть указатель на нее. И ещё вопрос, почему компилятор пропускает этот кусок кода, строка же константная. Или компилятор не знает ещё об этом ?
Спасибо Вам за ответы! |
|
lanz | Дата 14.1.2016, 17:35 |
Цитата эквивалентны ли эти записи Нет конечно, вторая запись эквивалентна
Здесь массив просто вырождается(decay) в тип указателя:
Но указывает все равно на массив. Рекомендуется к прочтению: http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr |
|
TheJax | Дата 14.1.2016, 17:15 |
Алексей1153 и lanz, благодарю вас за ответы. Если правильно понял, то в первом случае ( char *ptr), в этот самый ptr возвращается указатель на константную строку. Тогда скажите, пожалуйста, эквивалентны ли эти записи:
|
|
lanz | Дата 14.1.2016, 10:03 |
В первом случае: Компилятор знает сколько памяти нужно для строки и на этапе компиляции помещает строку в исполняемый файл. А в ptr загружается адрес строки. При исполнении загрузчик загружает строку в нужный адрес и все работает Во втором случае происходит http://en.cppreference.com/w/cpp/language/..._initialization Выделяется массив pp, который код инициализации заполняет нужной строкой. EDIT2: http://c-faq.com/decl/strlitinit.html |
|
Алексей1153 | Дата 14.1.2016, 7:31 |
не, new не вызывается. Выражение Цитата "Hello World!"; возвращает указатель на константную строку, причём в конце строки обязательно будет 0 |
|
TheJax | Дата 14.1.2016, 1:30 |
Добрый вечер уважаемые программисты. Очень хотелось бы разобраться с одним вопросом, а именно. Вызывает ли компилятор неявно оператор new в данном случае:
И в этом случае:
Вот для символов Hello World! вызывается оператор new? Ведь указатель ptr указывает на какой-то адрес, как тогда этот адрес выделяется? И почему указатель ptr является константным ?? С указателем pp все ясно, там идет работа с копией строки "Hello World!", а вот с ptr не очень. Спасибо!!! |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.3.2024, 20:43 |