Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Pavel.fromBy
13 / 13 / 0
Регистрация: 31.12.2011
Сообщений: 83

Стек или динамическая память!?

28.01.2012, 20:44. Показов 4864. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер всем! Прошу ответить на вопрос (ниже приведен код): почему строка "Test!" выводится на экран? Она же не была создана в дин. памяти, т.е. должна была "загнуться" после 1ой строки main(). Заранее благодарен...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
using namespace std;
 
char *Test()
{
    return "Test!";
}
 
int main()
{
    char *p = Test();
    cout << p << endl;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2012, 20:44
Ответы с готовыми решениями:

Стек и динамическая память
Читаю книжку по с++. Для хранения переменных может использоваться стек или динамическая память. чтоб поместить в стек нужно объявить...

Динамическая память и стек,различие
подскажите в чем различие дин.памяти по отношению к стеку..и почему дин память лучше..?

Память. Стек или куча - есть ли преимущества одного кода над другим?
Здравствуйте, хотел спросить в чем различия. В чем тут недостатки и преимущества разных способов? Apple apple(); и Apple *apple = new...

29
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
28.01.2012, 23:20
Студворк — интернет-сервис помощи студентам
Evg, Евгений очень хорошо что ты здесь.

очень хотелось бы четкого понимания

char *Test()
{
return "Test!";
}
Для всех думаю. Значит для "abc" возврат законный? Просто идет присваивание адреса "той" памяти другой переменной?
Хочу уточнить. Можно ли использовать данный указатель как критерий для сравнения, пока идет программа?
На форуме товарищи сказали что нет

C++
1
2
3
4
5
6
const char* p;
 
//.....
//.......
 
if(p == "Test")
0
 Аватар для Pavel.fromBy
13 / 13 / 0
Регистрация: 31.12.2011
Сообщений: 83
28.01.2012, 23:21  [ТС]
Evg, про строки, с трудом, но разобрался (хотя, не понятно почему он делает массив символов статическим). Спасибо. А как быть с этим:
C++
1
2
3
4
5
6
7
.....
int &func()
{
int a = 20;
return a;
}
....
Если в мейне принять результат этой функции ссылкой, то все, опять же, будет в порядке. Здесь та же ситуация?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.01.2012, 23:23
М... а из того описания непонятно? В общем

C
1
2
3
4
char *Test()
{
  return "Test!";
}
эквивалентно

C
1
2
3
4
5
static char tmp[6] = { 'T', 'e', 's', 't', '!', '\0' };
char* Test (void)
{
  return &(tmp[0]);
}
Добавлено через 1 минуту
Цитата Сообщение от Pavel.fromBy Посмотреть сообщение
Evg, про строки, с трудом, но разобрался. Спасибо. А как быть с этим:
C++
1
2
3
4
5
6
7
.....
int &func()
{
int a = 20;
return a;
}
....
Если в мейне принять результат этой функции ссылкой, то все, опять же, будет в порядке. Здесь та же ситуация?
Нет, здесь как раз-таки опасная ситуация. Возвращается ссылка на локальный (а не глобальный) объект. Строка (а точнее, строковой литерал) по определению является глобальным объектом
2
 Аватар для Pavel.fromBy
13 / 13 / 0
Регистрация: 31.12.2011
Сообщений: 83
28.01.2012, 23:27  [ТС]
Evg, все, со строками покончено Не заметил, что статик до функции. Теперь с интами... Ситуация, может и опасная, но почему работает? Ведь не должно же!!! Объект умирает и ссылка является псевдонимом хрен знает чего... (где-то я уже это писал ).
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
28.01.2012, 23:29
Evg,

C++
1
2
3
4
5
6
7
8
9
const char* p = "Test";
 
//.....
//.......
 
if(p == "Test")
{
 
}
можно так или нет? хочется узнать именно твое мнение. область памяти, адрес будут одинаковы?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.01.2012, 23:31
Цитата Сообщение от Pavel.fromBy Посмотреть сообщение
Объект умирает
Объект умирает, но память, где этот объект лежал, загадить ещё никто не успел. Но если после вызова твоей func, возвращающей ссылку, ты вызовешь ещё какую-нибудь функцию, то она уже эту память подпортит

Вот тут я кидал ссылку Deep C
Там в том числе и про этот случай рассказывается. Кстати, func может возвращать хоть ссылку, хоть указатель - по сути дела это одно и то же
1
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
28.01.2012, 23:33
Pavel.fromBy, после выхода из функции память в стеке не очищается, а просто оказывается выше текущей вершины. Так что, если ничего не успело занять там место и страницу памяти не вернули системе, данные там останутся те же. Но рассчитывать на это не стоит, если случится последнее "если" приложение рухнет с сегфолтом.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.01.2012, 23:33
Цитата Сообщение от AzaKendler Посмотреть сообщение
можно так или нет? хочется узнать именно твое мнение. область памяти, адрес будут одинаковы?
В данной программе имеется два строковых литерала. Поскольку они по стандарту являются const-объектами, то компилятор имеет право эти два объекта положить в одно и то же место памяти. На вопрос "можно или нет" ответ "нельзя". На вопрос "будут ли одинаковыми" ответ "зависит от компилятора"
1
 Аватар для Pavel.fromBy
13 / 13 / 0
Регистрация: 31.12.2011
Сообщений: 83
28.01.2012, 23:34  [ТС]
Evg, премного благодарен! Вопросов нет... За ссылку отдельное спасибо... Хоть и с английским не очень дружу, обязательно посмотрю!
NoMasters, и вам спасибо!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.01.2012, 23:36
Цитата Сообщение от Evg Посмотреть сообщение
На вопрос "можно или нет" ответ "нельзя"
Тут из разряда "нельзя, но если очень хочется, то можно". Если программа пишется под конкретную версию компилятора, если программист заведомо знает, что компилятор умеет одинаковые строки класть в одну память, если программист знает, что в качестве аргумента сравнения всегда будет указатель, инициализированный именно строковым литералом, то можно. Но при этом программист будет сидеть на бочке с динамитом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2012, 23:36

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Динамическая структура данных (Стек)
Подскажите в чем ошибка, пожалуйста. Программа выдает ошибку (&quot;Прекращена работа программы..&quot;), когда выбираю &quot;y&quot;...

Динамическая память
в чем ошибка #include &lt;iostream&gt; #include &quot;conio.h&quot; using namespace std; class{A int a; double b; char s; }

Динамическая память с++
Как использовать динамическую память в с++

Динамическая память [new]
Если записать так: char *p; p = new char; cin&gt;&gt;p; for(int i=0; i&lt;strlen(p); i++) cout&lt;&lt;p&lt;&lt;endl;


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru