crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Указатель char на строку.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
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
  На практике разница такая:
const char * fn1() {
  const char * a = "Hello";
  return a; // OK
}

const char * fn2() {
  const char a[] = "Hello";
  return a; // whoops вернет трэш
}

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" ). Похожа ли по смыслу вторая запись, т.е. ,что, есть константная строка, и есть указатель на нее.

И ещё вопрос, почему компилятор пропускает этот кусок кода, строка же константная. Или компилятор не знает ещё об этом ?
...
char *ptr="Hello";

ptr[1]='I';
...


Спасибо Вам за ответы! :)
lanz Дата 14.1.2016, 17:35
 
Цитата
эквивалентны ли эти записи

Нет конечно, вторая запись эквивалентна
const char string[] = "Hello";


Здесь массив просто вырождается(decay) в тип указателя:
const char *ptr=string;

Но указывает все равно на массив.

Рекомендуется к прочтению:
http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr
TheJax Дата 14.1.2016, 17:15
  Алексей1153 и lanz, благодарю вас за ответы.
Если правильно понял, то в первом случае ( char *ptr), в этот самый ptr возвращается указатель на константную строку.
Тогда скажите, пожалуйста, эквивалентны ли эти записи:

...
char *ptr="Hello";
...
// эквивалентно ли это -
...
const char string[6]={'H','e','l','l','o','\0'};

const char *ptr=string;
...
lanz Дата 14.1.2016, 10:03
  В первом случае:
Компилятор знает сколько памяти нужно для строки и на этапе компиляции помещает строку в исполняемый файл. А в ptr загружается адрес строки.
При исполнении загрузчик загружает строку в нужный адрес и все работает :lol:
Во втором случае происходит
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 в данном случае:
...
char *ptr="Hello World!";
...


И в этом случае:
...
char pp[]="Hello World!";
...


Вот для символов Hello World! вызывается оператор new? Ведь указатель ptr указывает на какой-то адрес, как тогда этот адрес выделяется?
И почему указатель ptr является константным ?? С указателем pp все ясно, там идет работа с копией строки "Hello World!", а вот с ptr не очень.

Спасибо!!!
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 20:43