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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alex1234
13 / 13 / 0
Регистрация: 11.02.2011
Сообщений: 55
#1

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

11.02.2011, 12:08. Просмотров 1221. Ответов 25
Метки нет (Все метки)

Здравствуйте! Подскажите как это работает? Правильно ли я понимаю?
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;      //Это эквивалент?
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2011, 12:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Глупый вопрос по указателям? (C++):

Оч глупый вопрос - C++
вот вместо цифры 1 как поставить переменную p->Bitmap->SaveToFile("C:\\bm\\rf\\1.bmp"); до этого баловался только с борландом.. поэтому...

Вопрос по указателям - C++
В учебнике Дейтелов нашел код: void convertToUppercase(char *); int main() { char string = "characters and $32.98"; ...

Вопрос по указателям - C++
Ребят, простите за такую глупость, но вот не знаю как ответить на чётко поставленный преподавателем вопрос : "Как зная указатель на...

простой и глупый вопрос - C++
Да, вопрос немного глуповат, но в нете так ничего и не нашла. Либо просто вводила не то для поиска. Не знаю короче. Суть вопроса: У меня...

Извините за глупый вопрос. - C++
Как в С++ записывается "и"? (Например в Pascal это "and"). И как записать это в условие типа: if (N<1000) "и" (N>100) { bla bla bla...

Глупый вопрос по шаблонам - C++
Доброе время суток! Я достаточно опытный программист Java, но жизнь, как говорится, заставила переквалифицироваться на C++, причем,...

25
Alex1234
13 / 13 / 0
Регистрация: 11.02.2011
Сообщений: 55
12.02.2011, 23:24  [ТС] #16
Еще раз.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A
{
public:
    virtual ~A(){}
};
 
class B: public A
{
public:
    B(){var2 = new int[10000];}
    int var[100000];
    int* var2;
    virtual ~B(){ delete var2; }
};
 
int main(int argc, char *argv[])
{
    B* z = new B;
    A* x = z;
 
    delete x;         //По указателю в vtable будет вызван
                      //деструктор B::~B(). Чего тут понимать,
                      //на то A::~A() и виртуальный,
                      //в данном случае для освобождения 
                      //памяти от var2.
    
    z->var[500] = 3;  //Мне интересно что будет в этом случае?
}
0
Лаподь
Заблокирован
13.02.2011, 00:33 #17
Цитата Сообщение от Alex1234 Посмотреть сообщение
C++
1
2
3
4
5
delete x;   //По указателю в vtable будет вызван 
            //деструктор B::~B(). Чего тут понимать, 
            //на то A::~A() и виртуальный, 
            //в данном случае для освобождения 
            //памяти от var2.
А также будет освобождена память, выделенная ранее по new B для экземпляра класса B (для его не динамических полей).

Цитата Сообщение от Alex1234 Посмотреть сообщение
C++
1
z->var[500] = 3;   //Мне интересно что будет в этом случае?
Обращение к свободной (не помеченной как используемой программой) памяти (если какой подпроцесс не успеет к тому времени занять) с непредсказуемыми последствиями.
0
Alex1234
13 / 13 / 0
Регистрация: 11.02.2011
Сообщений: 55
13.02.2011, 21:52  [ТС] #18
Спасибо большое за ответ!!! А то я совсем запарился.

Добавлено через 9 минут
Извиняюсь Напильнег, пост не увидел. А почему память по переменную z типа (B *), выделяется в стеке? Я думал в куче.

Добавлено через 19 часов 47 минут
Добрый вечер! У меня еще вопрос, уже по строкам.
C++
1
2
3
4
5
6
7
8
9
10
int main(int argc, char *argv[])
{
    char* str = "Hello world";  //т.е. const char* str;
                                  //но много где видел и такое.
    
    str[0]   = 'M';    //Компилятор без разговоров проглатывает,
    *(str+2) = 'r';    //но ничего не пишет в строку.
    
    cout << str;       //Выводит Hello world 
}
Происходит ли запись какой нибудь памяти str[0] = 'M'; *(str+2) = 'r'; или эти строки не выполняются?
0
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
13.02.2011, 21:55 #19
У меня программа зависает при попытке выполнить программу. При комментировании 7 и 8 строк - отрабатывает. Но делать так всё равно нехорошо. Нужно выделить память под str, а потом уже что-то в неё писать.
0
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,491
Записей в блоге: 2
Завершенные тесты: 1
13.02.2011, 22:03 #20
По идеи такое не должно работать. Но вот последний gcc позволяет такое делать (точнее именно так я не пробовал, но константные строки менял)), что по-моему не есть правильно.
0
Alex1234
13 / 13 / 0
Регистрация: 11.02.2011
Сообщений: 55
13.02.2011, 23:30  [ТС] #21
Спасибо большое! У меня последний gcc, в разных вариантах программа не падает, но подозрения на некорректную работу с памятью тоже были. Надо бы в дизассемблированном виде на это посмотреть, но лень.
0
Лаподь
Заблокирован
14.02.2011, 00:07 #22
Цитата Сообщение от Alex1234 Посмотреть сообщение
А почему память по переменную z типа (B *), выделяется в стеке? Я думал в куче.
Потому, что она там выделяется. И подозреваю, что так делается в подавляющем большинстве языков программирования. Покури что-нибудь на предмет "автоматические переменные" для прояснения.
0
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.02.2011, 00:11 #23
Лаподь, тут по-моему идут непоянтки... Напильнег придрался к словам ТСа о том, что, мол, указатель выделяется в куче, а ТС на самом деле имел ввиду, что память, на которую устанавливается указатель, выделяется в куче. Понятно, что сама переменная-указатель выделяется в стеке, но часто на подсознательном уровне программисты связывают переменную-указатель с памятью, на которую он указывает, хотя на самом деле это разные области памяти, одна - стек (сама переменная-указатель), другая - куча (та память, на которую этот указатель указывает).
0
Лаподь
Заблокирован
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 Посмотреть сообщение
тут по-моему идут непоянтки... ТС на самом деле имел ввиду, что память, на которую устанавливается указатель, выделяется в куче. Понятно, что сама переменная-указатель выделяется в стеке, но часто на подсознательном уровне программисты связывают переменную-указатель с памятью, на которую он указывает, хотя на самом деле это разные области памяти,
Что ж, возможно так оно и есть - ТС имел в виду. Но я высказался абсолютно точно и грамотно, пусть читает до полного прояснения и учится стоить правильные ассоциации на "подсознательном уровне" - в программировании даже один символ может иметь драматическое значение, надо привыкать к строгости.
0
silent_1991
14.02.2011, 00:38
  #25

Не по теме:

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

0
Alex1234
13 / 13 / 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;
0
14.02.2011, 12:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 12:27
Привет! Вот еще темы с ответами:

Глупый вопрос про наследование - C++
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { private: /** * @brief Возвращает...

Глупый вопрос (возведение в квадрат) - C++
Всем привет. Почему то не работает следующая элементарныя строчка кода. Значения y получаются отрицательными, например около -30000, хотя...

Глупый вопрос по типу данных Variant - C++
Обнаружил, что не очень четко понимаю что он из себя представляет и при его использовании возникает пачка вопросов. Может быть...

Глупый вопрос по считыванию символов с клавиатуры - C++
заранее извиняюсь за глупый вопрос, но ответ на него отгуглить не смог: n = getche не считывает нажатия на enter, но считывает пробелы...


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

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

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