Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
#1

Указатель на строковую константу - C++

07.09.2013, 20:28. Просмотров 1100. Ответов 23
Метки нет (Все метки)

Здравствуйте уважаемые форумчане!

Подскажите пожалуйста является ли эта ситуация выходом за пределы массива или размер массива автоматически подгоняется?:
C++
1
2
char * ptr = new char;
ptr = "I am massive";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2013, 20:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на строковую константу (C++):

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

Указатель на строковую константу. В чем отличие двух приведенных примеров - C++
char *x; x = "Текст"; это указатель на строковую константу. char x="Текст"; - строка(т.е. массив символов). В чём отличие...

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

Преобразование в указатель на указатель на константу - C++
В упор не могу понять правила которые приводит Дьюхерст для преобразований "многоуровневых" указателей. (Дьюхерст "Скользкие места...

Константный указатель на константу меняет значение - C++
int d = 7; const int* const cd = &d; d = 8; qDebug()<<*cd;

ссылка на указатель на константу. Не могу врубиться - C++
Добрый вечер! Не подскажите почему только выражение с pi_ref3 верное, а остальные - нет (VS 2013). Выражение с pi_ref1 вроде как-то...

23
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
07.09.2013, 20:36 #2
ptr - это вообще не массив, и он указывает на первый символ строки
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
07.09.2013, 20:42 #3
Цитата Сообщение от BESSON_off Посмотреть сообщение
Подскажите пожалуйста является ли эта ситуация выходом за пределы массива или размер массива автоматически подгоняется?:
1) Вы выделили место под один символ.
2) Вы просто взяли и поменяли адрес, содержащийся в указателе.
3) Это утечка памяти
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
07.09.2013, 20:56  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы просто взяли и поменяли адрес, содержащийся в указателе
То есть строковая константа расположилась в стековой памяти?
Смысл этой записи аналог этому (утечка памяти опущена)?:
C++
1
2
3
char * ptr;
char mas[] = "I am massive";
ptr = mas;
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:19 #5
строковая константа находится в оперативной памяти (heap), а переменная-указатель (ptr) таки да - в стековой.
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
07.09.2013, 21:20 #6
C++
1
2
3
4
5
6
char * ptr; /* ты создал указатель ptr, но память под него не выделил, он указывает ни на что, на NULL */
char mas[] = "I am massive"; /* ты создал массив mas */
ptr = mas; /* ты присвоил указателю ptr адрес массива mas, 
теперь если ты изменишь *ptr то изменится и mas, 
а если изменишь mas то изменится и *ptr т.к. это один и тот же объект, 
ну всмысле одно объект, а второе указатель на этот объект. */
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:25 #7
не будет в общем никакой утечки, ты просто создал указатель на массив.
но при удалении массива его тоже надо будет удалить
C++
1
2
delete [] mas;
delete ptr;
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
07.09.2013, 21:30 #8
Цитата Сообщение от fit Посмотреть сообщение
но при удалении массива его тоже надо будет удалить
чего
ты хоть один new видел?
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:34 #9
Цитата Сообщение от ValeryS Посмотреть сообщение
чего
ты хоть один new видел?
лол, точно. спросоня с первым постом автора попутал))
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
07.09.2013, 21:59 #10
Цитата Сообщение от fit Посмотреть сообщение
лол, точно. спросоня с первым постом автора попутал))
да даже если попутал
удалять то нечего, он указатель потерял
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.09.2013, 22:00 #11
Цитата Сообщение от VLK Посмотреть сообщение
он указывает ни на что, на NULL
в указателе мусор, а не NULL
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
07.09.2013, 22:27 #12
Цитата Сообщение от Jupiter Посмотреть сообщение
в указателе мусор, а не NULL
тоже верно
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
07.09.2013, 23:27 #13
Цитата Сообщение от fit Посмотреть сообщение
C++
1
delete [] mas;
Цитата Сообщение от fit Посмотреть сообщение
спросоня с первым постом автора попутал))
Цитата Сообщение от ValeryS Посмотреть сообщение
удалять то нечего, он указатель потерял
Да даже если бы не потерял, delete [] не прокатил бы.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
08.09.2013, 00:29 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Да даже если бы не потерял, delete [] не прокатил бы.
то же правильно
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.09.2013, 01:04 #15
Цитата Сообщение от fit Посмотреть сообщение
строковая константа находится в оперативной памяти (heap)
нет, как не крути это будет не хип, возможно стек, но скорее всего другая секция

C++
1
2
3
4
5
6
7
8
#include <cstdio>
 
const char* var = "hello world";
 
int main ()
{
    printf ("%s", var);
}
Bash
1
2
3
> g++ -g 4.cpp
> nm -a ./a.out| grep var
0000000000601028 D var
"D"
"d" The symbol is in the initialized data section.
0
08.09.2013, 01:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 01:04
Привет! Вот еще темы с ответами:

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru