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

Непонятное поведение - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Для каждого столбца матрицы найти значение и индекс максимального элемента http://www.cyberforum.ru/cpp-beginners/thread1087537.html
Для каждого столбца матрицы найти значение и индекс максимального элемента. Спасибо!
C++ Не могу понять код, кто может объяснить чайнику? Есть код С++ магического квадрата. Писал с помощью интернета полгода назад. Сейчас не могу разобраться что к чему Кое что понимаю, но с массивами вообще беда, помогите люди добрые. Раньше код был... http://www.cyberforum.ru/cpp-beginners/thread1087534.html
Вычислить сумму заштрихованной части матрицы C++
Здравствуйте! Нужно вычислить сумму заштрихованной части матрицы. Спасибо)
C++ Определить является ли лабиринт правильным
карта представляет собой лабиринт 1=стена, 0=проход карта представляет собой лабиринт надо определить является ли лабиринт правильным правильный лабиринт - такой лабиринт, в котором из любого...
C++ Замена реурсивного класса при переводе с Java на C++ http://www.cyberforum.ru/cpp-beginners/thread1087529.html
Собственно, перевожу одну вещь с Java на C++ и столкнулся с такой проблемой: //импорты public class Block { //Код не имеющий отношения к проблеме public static final Block blocksList = new...
C++ Ввести строку символов, переформатировать Здравствуйте! Нужно решить следующую задачу. Никак не получается ... Ввести строку символов, переформатировать, продлив до длины 60 символов равномерным добавлением пробелов между словами.... подробнее

Показать сообщение отдельно
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127

Непонятное поведение - C++

02.02.2014, 15:19. Просмотров 479. Ответов 8
Метки (Все метки)

Всем привет! В книге "Прата - Язык программирования C++. Лекции и управжения 2011" нашёл вот такой пример:

C++
1
2
3
4
5
6
7
const free_throws &clone( free_throws &ft )
{
    free_throws *pt;
    *pt = ft;
 
    return *pt
}
Изначально задался вопросом - каким образом это работает, ведь указатель ведёт на неопределённую область памяти?

Упростил код:

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
29
30
31
struct A
{
    A( int i ) : i_(i)
    {
        cout << "A( " << i << " )" << endl;
    }
 
    int i_;
};
 
const A &clone( A &a )
{
    A *aa;
    
    cout<<"a reference: "<<&a<<endl;
    cout<<"aa reference: "<<&aa<<endl;
    
    // *aa = a;
    
    return *aa;
}
 
int main()
{
    A a1(67);
    A a2 = clone( a1 );
    
    cout << a2.i_;
    
    return 0;
}
При компиляции с помощью clang с флагом -O2 или без, в a2.i_ лежит мусор, и по всей логике это правильно.
gcc с флагом -O2 выдаёт Segmentation fault, пускай хотя бы так.
А вот gcc без флагов выдаёт 67!

Теперь раскомментируем строку:
C++
1
*aa = a;
И вот результат:
Код
clang без флагов - Bus error: 10
clang с -O2 выдаёт 67
gcc без флагов выдаёт 67!
gcc с -02 выдаёт - Bus error: 10
Версии компиляторов:
Код
g++ (GCC) 4.9.0
clang-500.2.79
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru