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

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

Войти
Регистрация
Восстановить пароль
 
Алексей_x86
1 / 1 / 0
Регистрация: 17.01.2013
Сообщений: 21
#1

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

17.06.2014, 14:43. Просмотров 313. Ответов 11
Метки нет (Все метки)

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

Как работает данный код? И почему не компилируется? - C++
Обьясните пожалуйста как работает данный код, и скажите почему он не компилируется? И есть ли способ считать числа еще быстрее? ...

Почему код не работает? - C++
#include &lt;iostream&gt; using namespace std; unsigned long double* remove(unsigned long double* Arr, size_t* Size) { ...

почему код не работает? - C++
помогите пожалуйста, почему у меня код не работает? Ввожу &quot;х&quot;, потом погрешность, а arth всегда =0. приложил Документ WORD, там...

Почему не работает код? - C++
подскажите пожалуйста почему мой код не работает. от меня требуется отсортировать целые числа и напечатать с начало четные, потом нечетные...

Почему не работает код? - C++
можете подсказать почему мой код не работает? задача, из файла читаются футбольные команды и счета, а программа составляет турнирную...

Почему не работает код? - C++
можете подсказать почему мой код не работает правильно ??? задача вот в чем Вход программы имеет следующий формат. Сначала...

11
aLarman
642 / 563 / 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
просто повезло)
0
Croessmah
Эксперт CЭксперт С++
13428 / 7583 / 856
Регистрация: 27.09.2012
Сообщений: 18,675
Записей в блоге: 3
Завершенные тесты: 1
17.06.2014, 14:49 #3
C++
1
2
    cout << arr[0].val << endl;
    << arr[1].val;
Компилируется?
0
aLarman
17.06.2014, 14:52
  #4

Не по теме:

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

0
Croessmah
17.06.2014, 14:53
  #5

Не по теме:

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

0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
17.06.2014, 14:53 #6
Не скомпилируется.
0
aLarman
17.06.2014, 14:54
  #7

Не по теме:

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

0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
17.06.2014, 14:56 #8
Алексей_x86, что именно непонятно?
0
Алексей_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 (но это опасно, т.к. эти ячейки могут быть спокойно перезаписаны).
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
17.06.2014, 15:10 #10
Время жизни строковых литералов статично. Они создаются при запуске и существуют все время выполнения программы.
2
Алексей_x86
1 / 1 / 0
Регистрация: 17.01.2013
Сообщений: 21
17.06.2014, 15:13  [ТС] #11
Т.е. они размещаются в статической памяти?
Хм.. Это и в С в С++ такой механизм размещения строковых литералов?
0
Croessmah
Эксперт CЭксперт С++
13428 / 7583 / 856
Регистрация: 27.09.2012
Сообщений: 18,675
Записей в блоге: 3
Завершенные тесты: 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).
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 15:13
Привет! Вот еще темы с ответами:

Почему не работает код? - C++
Может кто найдёт ошибку: #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; #include &lt;windows.h&gt; ...

Фибоначчи: почему не работает код? - C++
#include &lt;iostream&gt; using namespace std; int fib(int); int main() { for (size_t i = 0; i &lt;= 5; i++) {

Почему работает данный код? - C++
В разделе &quot;Комбинаторика&quot; ( http://www.cyberforum.ru/combinatorics/thread572992.html ) задали вопрос: Сколько четырехзначных чисел можно...

Почему правильно работает код? - C++
В первом файле 5 слов, во втором - 10. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { FILE *f1, *f2; f1 =...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
17.06.2014, 15:13
Ответ Создать тему
Опции темы

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