crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Указатель char на строку.
Гость_TheJax_*
сообщение 14.1.2016, 1:30
Сообщение #1





Гости








    


Добрый вечер уважаемые программисты. Очень хотелось бы разобраться с одним вопросом, а именно.
Вызывает ли компилятор неявно оператор new в данном случае:
...
char *ptr="Hello World!";
...


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


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

Спасибо!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 14.1.2016, 7:31
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2809
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 191 раз(а)




Репутация:   34  


не, new не вызывается. Выражение

Цитата
"Hello World!";


возвращает указатель на константную строку, причём в конце строки обязательно будет 0

Во втором случае используется не копия, а такой же, по сути, указатель - тут я наврал ))

Сообщение отредактировал Алексей1153 - 15.1.2016, 8:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.1.2016, 10:03
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 108 раз(а)




Репутация:   8  


В первом случае:
Компилятор знает сколько памяти нужно для строки и на этапе компиляции помещает строку в исполняемый файл. А в ptr загружается адрес строки.
При исполнении загрузчик загружает строку в нужный адрес и все работает :lol:
Во втором случае происходит
http://en.cppreference.com/w/cpp/language/..._initialization
Выделяется массив pp, который код инициализации заполняет нужной строкой.

EDIT2:
http://c-faq.com/decl/strlitinit.html

Сообщение отредактировал lanz - 14.1.2016, 10:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_TheJax_*
сообщение 14.1.2016, 17:15
Сообщение #4





Гости








    


Алексей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, 17:35
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 108 раз(а)




Репутация:   8  


Цитата
эквивалентны ли эти записи

Нет конечно, вторая запись эквивалентна
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:58
Сообщение #6





Гости








    


lanz, да, извиняюсь, чушь написал. Имелось ввиду следующее.
В первой строке ( char *ptr="Hello"; ) создается константная строка и указатель на константную строку ( "Hello" ). Похожа ли по смыслу вторая запись, т.е. ,что, есть константная строка, и есть указатель на нее.

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

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


Спасибо Вам за ответы! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.1.2016, 18:03
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 108 раз(а)




Репутация:   8  


На практике разница такая:
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 т.е. это не обязательно.

Сообщение отредактировал lanz - 14.1.2016, 18:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_TheJax_*
сообщение 14.1.2016, 18:15
Сообщение #8





Гости








    


lanz, дошло, спасибо Вам )).

Касательно Ваших двух примеров. А почему во втором случае возвращается мусор? Из-за того, что, массив "а" создается на стеке и выходя за пределы функции данные ( массив "а" ) уничтожается и указатель указывает на мусор ? Так ? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.1.2016, 18:20
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 108 раз(а)




Репутация:   8  


Цитата
массив "а" создается на стеке и выходя за пределы функции данные ( массив "а" ) уничтожается

В целом да. Вообще это детали реализации где он создается, более важно что время его жизни ограничено областью функции, т.к. это локальная переменная.

Сообщение отредактировал lanz - 14.1.2016, 18:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_TheJax_*
сообщение 14.1.2016, 18:24
Сообщение #10





Гости








    


lanz, все понятно. Спасибо Вам огромное!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.1.2018, 4:29