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

Глупый вопрос по указателям? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alex1234
 Аватар для Alex1234
12 / 12 / 0
Регистрация: 11.02.2011
Сообщений: 55
11.02.2011, 12:08     Глупый вопрос по указателям? #1
Здравствуйте! Подскажите как это работает? Правильно ли я понимаю?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct A
{
};
 
struct B: public A
{
    int var1;
    int var2;
};
 
int main(int argc, char *argv[])
{
    A* x = new A;            //Памяти выделяется на объект от A
    B* y = (B*)x;
    y->var2 = 5;              //Пишет не в свою память?
    ((B*)x)->var2 = 5;      //Это эквивалент?
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2011, 12:08     Глупый вопрос по указателям?
Посмотрите здесь:

простой и глупый вопрос C++
C++ Вопрос по указателям
C++ Вопрос по указателям
C++ Оч глупый вопрос
C++ Глупый вопрос (возведение в квадрат)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex1234
 Аватар для Alex1234
12 / 12 / 0
Регистрация: 11.02.2011
Сообщений: 55
13.02.2011, 23:30  [ТС]     Глупый вопрос по указателям? #21
Спасибо большое! У меня последний gcc, в разных вариантах программа не падает, но подозрения на некорректную работу с памятью тоже были. Надо бы в дизассемблированном виде на это посмотреть, но лень.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Лаподь
Заблокирован
14.02.2011, 00:07     Глупый вопрос по указателям? #22
Цитата Сообщение от Alex1234 Посмотреть сообщение
А почему память по переменную z типа (B *), выделяется в стеке? Я думал в куче.
Потому, что она там выделяется. И подозреваю, что так делается в подавляющем большинстве языков программирования. Покури что-нибудь на предмет "автоматические переменные" для прояснения.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.02.2011, 00:11     Глупый вопрос по указателям? #23
Лаподь, тут по-моему идут непоянтки... Напильнег придрался к словам ТСа о том, что, мол, указатель выделяется в куче, а ТС на самом деле имел ввиду, что память, на которую устанавливается указатель, выделяется в куче. Понятно, что сама переменная-указатель выделяется в стеке, но часто на подсознательном уровне программисты связывают переменную-указатель с памятью, на которую он указывает, хотя на самом деле это разные области памяти, одна - стек (сама переменная-указатель), другая - куча (та память, на которую этот указатель указывает).
Лаподь
Заблокирован
14.02.2011, 00:36     Глупый вопрос по указателям? #24
Цитата Сообщение от Alex1234 Посмотреть сообщение
C++
1
2
  char* str = "Hello world"; //т.е. const char* str; 
                             //но много где видел и такое.
С чего это ты взял? То, что указатель инициализируется указателем на константу вовсе не означает, что он сам становится указателем на константу.

Цитата Сообщение от Alex1234 Посмотреть сообщение
C++
1
2
  str[0] = 'M'; //Компилятор без разговоров проглатывает, 
  *(str+2) = 'r'; //но ничего не пишет в строку.
Что-то не так с настройкой исполняющей системы - должно порождаться исключение, т.к. константы должны лежать в защищенной для записи области памяти.

Компилятор проглатывает потому, что str у тебя не является указателем на константу и ничего незаконного на этапе компиляции тут не происходит.

Добавлено через 10 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
тут по-моему идут непоянтки... ТС на самом деле имел ввиду, что память, на которую устанавливается указатель, выделяется в куче. Понятно, что сама переменная-указатель выделяется в стеке, но часто на подсознательном уровне программисты связывают переменную-указатель с памятью, на которую он указывает, хотя на самом деле это разные области памяти,
Что ж, возможно так оно и есть - ТС имел в виду. Но я высказался абсолютно точно и грамотно, пусть читает до полного прояснения и учится стоить правильные ассоциации на "подсознательном уровне" - в программировании даже один символ может иметь драматическое значение, надо привыкать к строгости.
silent_1991
14.02.2011, 00:38
  #25

Не по теме:

Лаподь, мне об этом можете не напоминать.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 12:27     Глупый вопрос по указателям?
Еще ссылки по теме:

Глупый вопрос по шаблонам C++
C++ Глупый вопрос про наследование
Извините за глупый вопрос. C++

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

Или воспользуйтесь поиском по форуму:
Alex1234
 Аватар для Alex1234
12 / 12 / 0
Регистрация: 11.02.2011
Сообщений: 55
14.02.2011, 12:27  [ТС]     Глупый вопрос по указателям? #26
Цитата Сообщение от Alex1234 Посмотреть сообщение
Спасибо большое за ответ!!! А то я совсем запарился.
C++
1
2
3
4
int main(int argc, char *argv[])
{
    char* str = "Hello world";  //т.е. const char* str;
                                  //но много где видел и такое.
Тут я не совсем понятно скомментировал, просто считаю const надо указывать.

Добавлено через 11 минут
Чет C++ совсем убивает. У меня еще вопрос появился.
C++
1
2
    int *x;
    new (x)int;    //Что может значить это выражение? Компилятор хавает, программа падает.
Добавлено через 2 часа 2 минуты
Извиняюсь, разобрался.
void* operator new (std::size_t size) throw (std::bad_alloc);
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
void* operator new (std::size_t size, void* ptr) throw();
C++
1
2
3
    
int *x;
x = new(std::nothrow) int;
Yandex
Объявления
14.02.2011, 12:27     Глупый вопрос по указателям?
Ответ Создать тему
Опции темы

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