Форум программистов, компьютерный форум CyberForum.ru

Указатель на строковую константу. В чем отличие двух приведенных примеров - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
27.01.2014, 14:40     Указатель на строковую константу. В чем отличие двух приведенных примеров #1
char *x;
x = "Текст"; это указатель на строковую константу.

char x[]="Текст"; - строка(т.е. массив символов).


В чём отличие двух вышеописанных примеров? Ведь и там и там х -это указатель на начало массива. Почему в первом случае строка - это константа, а во втором нет?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2014, 14:40     Указатель на строковую константу. В чем отличие двух приведенных примеров
Посмотрите здесь:

В чем отличие printf от cout? C++
C++ В чем отличие While от Do... While?
Преобразование в указатель на указатель на константу C++
Указатель на строковую константу C++
Указатель или ссылка на указатель. В чем разница? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.01.2014, 14:53     Указатель на строковую константу. В чем отличие двух приведенных примеров #2
При запуске приложения ему выделяется его личный сегмент памяти и все переменные, вроде
C++
1
char x[]="Текст"
, хранятся там. эта память очень быстрая, но надо заранее знать сколько попросить, ибо расширять сегмент по ходу дела нельзя. А ещё есть так называемая куча , в которой можно по ходу дела забить столько места, сколько нужно. Но тогда тебе нужно хранить адрес начала той части кучи, в которой хранятся твои данные, например
C++
1
char *x = "Текст";
. Все переменные в которых между типом и названием стоит завёздочка - хранят только адреса памти, а сами данные хранятся в куче.

Очень важно помнить, что после использования кучи в ней надо прибраться при помощи конструкций вида
C++
1
delete x;
, что бы куча памяти не превратилась в кучу мусора.
Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
27.01.2014, 14:58  [ТС]     Указатель на строковую константу. В чем отличие двух приведенных примеров #3
Тогда получается, что
C++
1
char *x = "Текст";
это своего рода динамический массив, а значит можно изменять и размер и содержимое. Но в книжках написано, что это константа(т.е. изменять нельзя). Получается противоречие. Где я ошибаюсь?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.01.2014, 15:04     Указатель на строковую константу. В чем отличие двух приведенных примеров #4
Не путай динамический массив с массивом в динамической памяти.

Добавлено через 41 секунду
И это не константа, так как нигде нет
C++
1
const
Добавлено через 1 минуту
Ты ведь не можешь написать
C++
1
int*A=new int[32];
, а потом обратиться
C++
1
A[45]=0;
Добавлено через 1 минуту
Можно только переопределить массив с новым размером, но тогда все данные в старом потеряются.

Добавлено через 1 минуту
Так и со строками.
C++
1
2
3
char *x = "Текст"; 
*x = "ТекстТекст"; 
 *x = "ТекстТекстТекстТекст";
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
27.01.2014, 15:07     Указатель на строковую константу. В чем отличие двух приведенных примеров #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Vegas_I, вот здесь можете популярно почитать: Строковые литералы в Си/Си++ .
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.01.2014, 16:12     Указатель на строковую константу. В чем отличие двух приведенных примеров #6

Не по теме:

Цитата Сообщение от НеСказочник Посмотреть сообщение
И это не константа, так как нигде нет
прикольно



Добавлено через 1 минуту
Цитата Сообщение от НеСказочник Посмотреть сообщение
Ты ведь не можешь написать

C++
1
int*A=new int[32];
, а потом обратиться

C++
1
A[45]=0;
молодой человек, а кто сказал что так нельзя ?)
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.01.2014, 16:14     Указатель на строковую константу. В чем отличие двух приведенных примеров #7
Цитата Сообщение от aLarman Посмотреть сообщение
молодой человек, а кто сказал что так нельзя ?)
Написать-то всё можно, только вот результат будет непредсказуемый. VS, к примеру, может вылететь с криками о повреждении кучи или даже найти где-то точку останова, которой ни кто не ставил.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.01.2014, 16:17     Указатель на строковую константу. В чем отличие двух приведенных примеров #8
Цитата Сообщение от НеСказочник Посмотреть сообщение
Написать-то всё можно, только вот результат будет непредсказуемый. VS, к примеру, может вылететь с криками о повреждении кучи или даже найти где-то точку останова, которой ни кто не ставил.
а если собрать в релизе а не в дебаге ?) может ничего и не произойти, а потом у вас почему то упадет Word

Добавлено через 1 минуту
такое обращение undefined behavior и к чему он приведет....известно только великому китайскому рандому
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.01.2014, 16:19     Указатель на строковую константу. В чем отличие двух приведенных примеров #9
В любом случае так нельзя. Если попросил 32 то и пользуй 32.

Добавлено через 1 минуту

Не по теме:

прикольно
кстати, что именно прикольно

ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
27.01.2014, 16:22     Указатель на строковую константу. В чем отличие двух приведенных примеров #10
Цитата Сообщение от НеСказочник Посмотреть сообщение
char *x = "Текст";
ты серьезно считаешь что память выделится в куче?
и обязательно нужен
Цитата Сообщение от НеСказочник Посмотреть сообщение
delete x
ну ежли желаешь краха программы то да
память в куче выделяется new и только для него удаление delete
или malloc удаление у него free
а
Цитата Сообщение от НеСказочник Посмотреть сообщение
char *x = "Текст";
равносилен
Цитата Сообщение от Vegas_I Посмотреть сообщение
char x[]="Текст";
aLarman
27.01.2014, 16:30
  #11

Не по теме:

Цитата Сообщение от НеСказочник Посмотреть сообщение
кстати, что именно прикольно
Ваши слова что
Цитата Сообщение от НеСказочник Посмотреть сообщение
И это не константа, так как нигде нет
C++
1
const

Убежденный
Системный программист
 Аватар для Убежденный
14211 / 6226 / 988
Регистрация: 02.05.2013
Сообщений: 10,381
Завершенные тесты: 1
27.01.2014, 16:32     Указатель на строковую константу. В чем отличие двух приведенных примеров #12
Цитата Сообщение от Vegas_I Посмотреть сообщение
Тогда получается, что это (char *x = "Текст")
своего рода динамический массив, а значит можно изменять и размер и содержимое.
Но в книжках написано, что это константа(т.е. изменять нельзя).
Получается противоречие. Где я ошибаюсь?
"Текст" в данном случае - это строковой литерал.
По стандарту языка C++, строковые литералы константны, а попытка их
изменения ведет к неопределенному поведению. Цитирую:

C++03, 2.13.4 String literals
1. A string literal is a sequence of characters (as defined in 2.13.2) surrounded
by double quotes, optionally beginning with the letter L, as in "..." or L"...".
A string literal that does not begin with L is an ordinary string literal, also
referred to as a narrow string literal. An ordinary string literal has type "array of n
const char"
and static storage duration (3.7), where n is the size of the string as
defined below, and is initialized with the given characters. A string literal that
begins with L, such as L"asdf", is a wide string literal. A wide string literal has
type "array of n const wchar_t"
and has static storage duration, where n is the size
of the string as defined below, and is initialized with the given characters.

2. Whether all string literals are distinct (that is, are stored in nonoverlapping
objects) is implementation defined. The effect of attempting to modify a string
literal is undefined
.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.01.2014, 16:44     Указатель на строковую константу. В чем отличие двух приведенных примеров #13
Извиняюсь, поспешил ответить и напутал.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.01.2014, 17:00     Указатель на строковую константу. В чем отличие двух приведенных примеров #14
Тут кто-то упомянул что из-за UB может "word упадёт". Не говорите глупости! Приложение из-за ошибок работы с указателями может попортить свою память и упасть, но уж соседний "word" никак не "упадёт"!
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.01.2014, 17:18     Указатель на строковую константу. В чем отличие двух приведенных примеров #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Приложение из-за ошибок работы с указателями может попортить свою память
т.е в соседний процесс не попадет?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.01.2014, 17:20     Указатель на строковую константу. В чем отличие двух приведенных примеров #16
Цитата Сообщение от aLarman Посмотреть сообщение
т.е в соседний процесс не попадет?
Под виндой точно нет. Если у кого есть ОС работающая не в защищённом режиме а в реальном, то возможно. Linux, вроде, тоже в защищённом работает.

Добавлено через 53 секунды
В DOS можно ОС убить, если неправильно обратиться по адресу.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
27.01.2014, 18:01     Указатель на строковую константу. В чем отличие двух приведенных примеров #17
Цитата Сообщение от aLarman Посмотреть сообщение
т.е в соседний процесс не попадет?
Цитата Сообщение от НеСказочник Посмотреть сообщение
Под виндой точно нет.
если пишешь приложения
а если дрова? т.е работаешь в режиме ядра
все что угодно вплоть до синего экрана

Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не говорите глупости! Приложение из-за ошибок работы с указателями может попортить свою память и упасть,
Кузя платформы не ограничиваются только Виндой
НеСказочник
27.01.2014, 18:01
  #18

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
т.е работаешь в режиме ядра
все что угодно вплоть до синего экрана
Ага. Написать ОС камикадзе, которая спустя 30 дней убивает себя и комп, если не зарегаешься.

Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
27.01.2014, 18:05  [ТС]     Указатель на строковую константу. В чем отличие двух приведенных примеров #19
Цитата Сообщение от Убежденный Посмотреть сообщение
"Текст" в данном случае - это строковой литерал.
По стандарту языка C++, строковые литералы константны, а попытка их
изменения ведет к неопределенному поведению. Цитирую:

C++03, 2.13.4 String literals
Хорошо, а почему строковые литералы константны? Я всё понять не могу. Вот у нас есть строка "Текст", это массив символов. С чего бы ему быть строковым литералом?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 18:08     Указатель на строковую константу. В чем отличие двух приведенных примеров
Еще ссылки по теме:

C++ cin.get в чем отличие ?
В чем отличие алгоритмов set_union и merge? C++
C++ Указатель на строковую константу

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
27.01.2014, 18:08     Указатель на строковую константу. В чем отличие двух приведенных примеров #20
Цитата Сообщение от НеСказочник Посмотреть сообщение
Написать ОС камикадзе,
зря смеешся
что кривые дрова ни разу не попадались?
а там нет разделение на свой чужой
и отловить их гораздо труднее

Не по теме:

у меня был ТВ тюнер
прекрасно работал под 98, и под хрюнделем при одноядерной системе
а стоило подключить под гипертрейдинг и сразу же упало
косяки при работе с потоками



Добавлено через 2 минуты
Цитата Сообщение от Vegas_I Посмотреть сообщение
а почему строковые литералы константны?
по стандарту
Цитата Сообщение от Vegas_I Посмотреть сообщение
Вот у нас есть строка "Текст", это массив символов.
эта строка расположена в области глобальных и статических элементов
т.е память выделена на этапе компиляции и никто её тебе менять не даст
дизасемблируй пару листингов и увидишь сам
Yandex
Объявления
27.01.2014, 18:08     Указатель на строковую константу. В чем отличие двух приведенных примеров
Ответ Создать тему
Опции темы

Текущее время: 16:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru