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

Литерал - что делать с указателем? - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
04.12.2013, 07:50     Литерал - что делать с указателем? #1
Недавно увидел нечто подобное. Раньше считал, что литерал может быть преобразован только в char[] - т.е. храниться на стеке, а там уже в функцию (допустим, при strcpy(somePointerChar, "text");) передается указатель на адрес этого литерала в стеке, но, похоже, дела обстоят иначе. Подскажите, как же все-таки выглядит литерал в памяти и нужно ли делать delete на указатель ниже, ведь, насколько я знаю, компилятор проводит оптимизацию вида "text" используется дважды? Создадим доп. переменную и все эти ссылку будут указывать на неё.
C++
1
char *str = (char*)"text";
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2013, 07:50     Литерал - что делать с указателем?
Посмотрите здесь:

C++ подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать
C++ Что мне делать или что надо знать перед тем как начать изучение яз.программирования С/С++?
сообщение что исходный файл не откомпилирован что делать? C++
Объясните что не так с указателем в программе C++
C++ Переделать функцию c указателем на int, на функцию с указателем на void
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
04.12.2013, 08:13     Литерал - что делать с указателем? #2
Литерал "text" размещается в статической памяти. Указателю str присваивается адрес этого литерала.

А вообще литерал - константый объект, поэтому:
C++
1
const char * str = "text";
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
04.12.2013, 08:16  [ТС]     Литерал - что делать с указателем? #3
Schizorb, что такое "статическая память"?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
04.12.2013, 08:26     Литерал - что делать с указателем? #4
Статическая память выделяется при запуске программы для размещения глобальных и локальных статических переменных.

Сам же указатель str будет размещен на стеке. Никаких копий литерала тут нет, в указателе просто хранится его адрес.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
04.12.2013, 08:31  [ТС]     Литерал - что делать с указателем? #5
Schizorb,
C++
1
MyStruct A;
а где тут память выделена? Мне говорили, что полностью в стеке хранится A :<
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
04.12.2013, 08:35     Литерал - что делать с указателем? #6
Смотря где эта запись находится. Если внутри функции - то на стеке, если объявлена глобально - то в статической.

Может пригодится, статейка небольшая:
http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xml
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.12.2013, 08:45     Литерал - что делать с указателем? #7
nexen, строка - это массив байтов:
C++
#include <iostream>
using namespace std;
 
int main() {
  cout << "text"[2] << endl; // x
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
04.12.2013, 08:48  [ТС]     Литерал - что делать с указателем? #8
programina, капитан, залогинься
Вопрос совершенно о другом
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.12.2013, 10:33     Литерал - что делать с указателем? #9
Цитата Сообщение от nexen Посмотреть сообщение
programina, капитан, залогинься
Вопрос совершенно о другом
Вот вам наглядный пример. Теперь все станет понятным.
C++
#include <iostream>
using namespace std;
 
 
void foo()
{
  char *s = (char*)"txet"; // поменяйте на text
  cout << (int*)&s[2] << endl;
  cout << (int*)&"text"[3] << endl;
}
 
 
int main() 
{
  foo();
 
  cout << endl;
 
  char *s = (char*)"text";
  cout << (int*)&s[2] << endl;
  cout << (int*)&"text"[3] << endl;
}
Добавлено через 57 минут
И глобальная и локальная переменные находятся в одной области памяти.....
C++
#include <iostream>
using namespace std ;
 
char g[] = "text";
 
void foo ()
{
  char *s = ( char *) "txet" ; // поменяйте на text
  cout << (int * ) & g[0] << endl;
  cout << (int * ) & s[0] << endl ;
  cout << (int * ) & "text"[0] << endl ;
}
 
int main ()
{
  foo () ;
 
  cout << endl ;
 
  char *s = ( char *) "text" ;
  cout << (int * ) & g[0] << endl;
  cout << (int * ) & s[0] << endl ;
  cout << (int * ) & "text"[0] << endl ;
}
Добавлено через 9 минут
C++
#include <iostream>
using namespace std ;
 
char *g = (char*)"text";
 
void foo ()
{
  char *s = ( char *) "txet" ; // поменяйте на text
  cout << (int * ) & g[0] << endl;
  cout << (int * ) & s[0] << endl ;
  cout << (int * ) & "text"[0] << endl ;
}
 
int main ()
{
  foo () ;
 
  cout << endl ;
 
  char *s = ( char *) "text" ;
  cout << (int * ) & g[0] << endl;
  cout << (int * ) & s[0] << endl ;
  cout << (int * ) & "text"[0] << endl ;
}
C++
// foo
0x8048a25 // g = text
0x8048a20 //    txet
0x8048a25 // s = text
 
// main
0x8048a25 // g = text
0x8048a25 //    text
0x8048a25 // s = text
Добавлено через 3 минуты
Странно, память распределена в обратном порядке по отношению к инициализации данных в программе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.12.2013, 10:36     Литерал - что делать с указателем? #10
Цитата Сообщение от programina Посмотреть сообщение
И глобальная и локальная переменные находятся в одной области памяти.....
А где в коде адрес локальной переменной?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.12.2013, 10:52     Литерал - что делать с указателем? #11
alsav22, "text" и "txet"

Добавлено через 1 минуту
вру, просто "text"

Добавлено через 3 минуты
снова вру, просто "text" и указатели на "text"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.12.2013, 10:56     Литерал - что делать с указателем? #12
Локальные там указатели s (в main() и в foo()), но вы же их адреса не вываодите. Что бы их адреса вывести:
C++
1
cout << &s << endl;
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.12.2013, 11:45     Литерал - что делать с указателем? #13
Цитата Сообщение от aslav22
C++
1
cout << &s << endl;
упс...
ideone.com сломался

Добавлено через 4 минуты
Код
SQLSTATE[HY000] [2003] Can't connect to MySQL
server on '192.168.13.52' (111)System error.
Добавлено через 9 минут
сейчас работает
C++
#include <iostream>
using namespace std;
 
char *g = (char *)"text";
 
int main()
{
    char *s = (char *)"text";
 
    cout << &"text" << endl;
    cout << &g << endl;
    cout << &s << endl;
}
C++
0x80487a0
0x80499e8
0xbf918b0c
Добавлено через 4 минуты
Это значит, что литерал "text" как и глобальная переменная g размещаeтся в стеке.

Добавлено через 11 минут
Умники, обьясните этот код, пожалуста:
C++
#include <iostream>
using namespace std;
 
char *g = (char *)"text";
 
int main()
{
    char *s = (char *)"text";
 
    cout << &"text" << endl;
    cout << (void*)&s[0] << endl ;
}
Добавлено через 6 минут
ладно, если не хотите обьяснять, тогда создам новую тему.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.12.2013, 12:19     Литерал - что делать с указателем? #14
Цитата Сообщение от programina Посмотреть сообщение
Это значит, что литерал "text" как и глобальная переменная g размещаeтся в стеке.
Это значит, что литерал "text" как и глобальная переменная g размещаeтся в статической памяти. Вот адрес на стеке (&s):
Цитата Сообщение от programina Посмотреть сообщение
0xbf918b0c
Добавлено через 11 минут
Цитата Сообщение от programina Посмотреть сообщение
обьясните этот код, пожалуста:
Это объяснить?
C++
1
cout << (void*)&s[0] << endl ;
Вывод, через cout <<, адреса указателя на char (если без приведения к void*, то выведется строка).

Добавлено через 14 минут
Не так написал. Вывод не адреса указателя на char (&s), а адреса, который содержится в указателе на char (в данном случае адреса s[0]).
Или так:
C++
1
cout << (void*)s << endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 12:46     Литерал - что делать с указателем?
Еще ссылки по теме:

C++ Что будет с указателем после использования операции delete?
В чем разница между указателем и указателем на указатель? C++
Что общего между именем массива и указателем? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
05.12.2013, 12:46     Литерал - что делать с указателем? #15
На всякий случай: http://www.cyberforum.ru/blogs/18334/blog97.html
Yandex
Объявления
05.12.2013, 12:46     Литерал - что делать с указателем?
Ответ Создать тему
Опции темы

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