1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
1

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

27.01.2014, 14:40. Показов 3004. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
char *x;
x = "Текст"; это указатель на строковую константу.

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


В чём отличие двух вышеописанных примеров? Ведь и там и там х -это указатель на начало массива. Почему в первом случае строка - это константа, а во втором нет?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2014, 14:40
Ответы с готовыми решениями:

Указатель на строковую константу
Здравствуйте уважаемые форумчане! Подскажите пожалуйста является ли эта ситуация выходом за...

Указатель на строковую константу
Всем привет. Я знаю что в С++ в основном юзается std::string,но сишные строки тоже желательно...

В чём отличие константного указателя и указателя на константу?
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Инициализация полей - в чем разница двух приведенных реализаций
class first { public first() { a=5; b="строка"; } int a;...

28
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
27.01.2014, 14:53 2
При запуске приложения ему выделяется его личный сегмент памяти и все переменные, вроде
C++
1
char x[]="Текст"
, хранятся там. эта память очень быстрая, но надо заранее знать сколько попросить, ибо расширять сегмент по ходу дела нельзя. А ещё есть так называемая куча , в которой можно по ходу дела забить столько места, сколько нужно. Но тогда тебе нужно хранить адрес начала той части кучи, в которой хранятся твои данные, например
C++
1
char *x = "Текст";
. Все переменные в которых между типом и названием стоит завёздочка - хранят только адреса памти, а сами данные хранятся в куче.

Очень важно помнить, что после использования кучи в ней надо прибраться при помощи конструкций вида
C++
1
delete x;
, что бы куча памяти не превратилась в кучу мусора.
0
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
27.01.2014, 14:58  [ТС] 3
Тогда получается, что
C++
1
char *x = "Текст";
это своего рода динамический массив, а значит можно изменять и размер и содержимое. Но в книжках написано, что это константа(т.е. изменять нельзя). Получается противоречие. Где я ошибаюсь?
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 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 = "ТекстТекстТекстТекст";
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
27.01.2014, 15:07 5
Лучший ответ Сообщение было отмечено Vegas_I как решение

Решение

Vegas_I, вот здесь можете популярно почитать: Строковые литералы в Си/Си++ .
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
27.01.2014, 16:12 6

Не по теме:

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



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

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

C++
1
A[45]=0;
молодой человек, а кто сказал что так нельзя ?)
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
27.01.2014, 16:14 7
Цитата Сообщение от aLarman Посмотреть сообщение
молодой человек, а кто сказал что так нельзя ?)
Написать-то всё можно, только вот результат будет непредсказуемый. VS, к примеру, может вылететь с криками о повреждении кучи или даже найти где-то точку останова, которой ни кто не ставил.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
27.01.2014, 16:17 8
Цитата Сообщение от НеСказочник Посмотреть сообщение
Написать-то всё можно, только вот результат будет непредсказуемый. VS, к примеру, может вылететь с криками о повреждении кучи или даже найти где-то точку останова, которой ни кто не ставил.
а если собрать в релизе а не в дебаге ?) может ничего и не произойти, а потом у вас почему то упадет Word

Добавлено через 1 минуту
такое обращение undefined behavior и к чему он приведет....известно только великому китайскому рандому
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
27.01.2014, 16:19 9
В любом случае так нельзя. Если попросил 32 то и пользуй 32.

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

Не по теме:

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

0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
27.01.2014, 16:22 10
Цитата Сообщение от НеСказочник Посмотреть сообщение
char *x = "Текст";
ты серьезно считаешь что память выделится в куче?
и обязательно нужен
Цитата Сообщение от НеСказочник Посмотреть сообщение
delete x
ну ежли желаешь краха программы то да
память в куче выделяется new и только для него удаление delete
или malloc удаление у него free
а
Цитата Сообщение от НеСказочник Посмотреть сообщение
char *x = "Текст";
равносилен
Цитата Сообщение от Vegas_I Посмотреть сообщение
char x[]="Текст";
0
aLarman
27.01.2014, 16:30
  #11

Не по теме:

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

0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 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
.
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
27.01.2014, 16:44 13
Извиняюсь, поспешил ответить и напутал.
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,485
Записей в блоге: 1
27.01.2014, 17:00 14
Тут кто-то упомянул что из-за UB может "word упадёт". Не говорите глупости! Приложение из-за ошибок работы с указателями может попортить свою память и упасть, но уж соседний "word" никак не "упадёт"!
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
27.01.2014, 17:18 15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Приложение из-за ошибок работы с указателями может попортить свою память
т.е в соседний процесс не попадет?
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
27.01.2014, 17:20 16
Цитата Сообщение от aLarman Посмотреть сообщение
т.е в соседний процесс не попадет?
Под виндой точно нет. Если у кого есть ОС работающая не в защищённом режиме а в реальном, то возможно. Linux, вроде, тоже в защищённом работает.

Добавлено через 53 секунды
В DOS можно ОС убить, если неправильно обратиться по адресу.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
27.01.2014, 18:01 17
Цитата Сообщение от aLarman Посмотреть сообщение
т.е в соседний процесс не попадет?
Цитата Сообщение от НеСказочник Посмотреть сообщение
Под виндой точно нет.
если пишешь приложения
а если дрова? т.е работаешь в режиме ядра
все что угодно вплоть до синего экрана

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

Не по теме:

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

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

C++03, 2.13.4 String literals
Хорошо, а почему строковые литералы константны? Я всё понять не могу. Вот у нас есть строка "Текст", это массив символов. С чего бы ему быть строковым литералом?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
27.01.2014, 18:08 20
Цитата Сообщение от НеСказочник Посмотреть сообщение
Написать ОС камикадзе,
зря смеешся
что кривые дрова ни разу не попадались?
а там нет разделение на свой чужой
и отловить их гораздо труднее

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от Vegas_I Посмотреть сообщение
а почему строковые литералы константны?
по стандарту
Цитата Сообщение от Vegas_I Посмотреть сообщение
Вот у нас есть строка "Текст", это массив символов.
эта строка расположена в области глобальных и статических элементов
т.е память выделена на этапе компиляции и никто её тебе менять не даст
дизасемблируй пару листингов и увидишь сам
0
27.01.2014, 18:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2014, 18:08
Помогаю со студенческими работами здесь

В чем разница двух примеров кода
Здравствуйте! while (Connected == true) { if (srReceiver.ReadLine()...

Как в классе создать строковую константу?
Как в классе создать строковую константу? Конструкция типа static const char __tmp_obj1 = "abc";...

Как правильно сравнить строку и строковую константу?
Всем здравствуйте. String s1 = "Asdf"; if(strcmp(s1, "ASDF")==0) Label1->Caption = "ДА";...

Напечатать все слова последовательности, содержащие строковую константу.
Дана последовательность до 30 слов, в каждом из которых от 1 до 5 символов, между словами - пробел,...

Как получить имя переменной, или преобразовать ее в строковую константу?
С#.Всем привет. Как получить имя переменной, или преобразовать ее в строковую константу

В чем отличие двух файлов
Добрый день кто сможет подсказать в чем отличие двух файлов <?xml version="1.0"...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru