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

Как и почему работает код? - C++

Восстановить пароль Регистрация
 
Алексей_x86
 Аватар для Алексей_x86
1 / 1 / 0
Регистрация: 17.01.2013
Сообщений: 21
17.06.2014, 14:43     Как и почему работает код? #1
Доброго времени суток.
Не могу понять почему работает код :
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
struct sA{
    char* val;
    sA(){
        val = nullptr;
    }
    sA(char* nV){
        val = nV;
    }
};
 
sA arr[2];
 
void init()
{
    arr[0] = sA("10101010");
    arr[1] = sA("1110010");
}
 
int main(){
    init();
    cout << arr[0].val << endl;
    << arr[1].val;
        cout << arr[2].val;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 14:43     Как и почему работает код?
Посмотрите здесь:

C++ Почему работает данный код?
C++ Почему код не работает?
Почему код на С++ работает быстрей C++
Почему правильно работает код? C++
C++ Почему этот код работает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
17.06.2014, 14:49     Как и почему работает код? #2
Цитата Сообщение от Алексей_x86 Посмотреть сообщение
C++
1
arr[1] = sA("1110010");
UB
C++
1
cout << arr[2].val;
UB
просто повезло)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
17.06.2014, 14:49     Как и почему работает код? #3
C++
1
2
    cout << arr[0].val << endl;
    << arr[1].val;
Компилируется?
aLarman
17.06.2014, 14:52
  #4

Не по теме:

Croessmah, не думаю что ТС спрашивал "как работает", если бы не компилировалось

Croessmah
17.06.2014, 14:53
  #5

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
Croessmah, не думаю что ТС спрашивал "как работает", если бы не компилировалось
тогда зачем приводить код, который не компилируется?

Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.06.2014, 14:53     Как и почему работает код? #6
Не скомпилируется.
aLarman
17.06.2014, 14:54
  #7

Не по теме:

Croessmah, банальный косяк копипасты

Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.06.2014, 14:56     Как и почему работает код? #8
Алексей_x86, что именно непонятно?
Алексей_x86
 Аватар для Алексей_x86
1 / 1 / 0
Регистрация: 17.01.2013
Сообщений: 21
17.06.2014, 15:04  [ТС]     Как и почему работает код? #9
Эх.. Случайно нажал на что-то на клавиатуре и отправил незаконченный пост, а редактировать не могу. Извиняюсь.

Вопрос по следующему коду.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct sA{
    char* val;
    sA(){
        val = nullptr;
    }
    sA(char* nV){
        val = nV;
    }
};
 
sA arr[2];
 
void init()
{
    arr[0] = sA("10101010");
    arr[1] = sA("1110010");
}
 
int main(){
    init();
    cout << arr[0].val << endl<< arr[1].val;
    
}
Я не могу понять почему работает код, отсюда вывод что я не понимаю некоторые механизмы работы С.
Я рассуждал так :
при инициализации массива структур в init(), в конструкторе в качестве аргумента типа char* я указываю строковую константу. Но сама же эта константа хранится в локальной памяти выделенной для функции, и после выхода из init() указатели char* всех структур в массиве arr будут указывают на участки памяти, в которых уже другие данные (т.к. после выхода из функции освобождается память ее локальных переменных).
Раз код работает, значит либо С скопировал строковую константу в другую область памяти (которая не удаляется при выходе из init()) и поместил указатель на нее в поле val, либо ячейки памяти, в которых находится локальные переменные функции init() были освобождены, но их значения не были стерты, поэтому я получаю правильный результат в cout (но это опасно, т.к. эти ячейки могут быть спокойно перезаписаны).
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.06.2014, 15:10     Как и почему работает код? #10
Время жизни строковых литералов статично. Они создаются при запуске и существуют все время выполнения программы.
Алексей_x86
 Аватар для Алексей_x86
1 / 1 / 0
Регистрация: 17.01.2013
Сообщений: 21
17.06.2014, 15:13  [ТС]     Как и почему работает код? #11
Т.е. они размещаются в статической памяти?
Хм.. Это и в С в С++ такой механизм размещения строковых литералов?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 15:13     Как и почему работает код?
Еще ссылки по теме:

C++ почему код не работает?
Почему не работает этот код? C++
Почему не работает код? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
17.06.2014, 15:13     Как и почему работает код? #12
вот:
Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow string literal has type “array of n const char”, where n is the size of the string as defined below, and has static storage duration (3.7).
Yandex
Объявления
17.06.2014, 15:13     Как и почему работает код?
Ответ Создать тему
Опции темы

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