Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
#1

Нужен пример того, что работать вроде не должно, но работает - C++

29.01.2014, 17:31. Просмотров 2439. Ответов 57
Метки нет (Все метки)

Есть у кого то парочка тем для размышления каких то конструкций, где вроде бы так делать нельзя, но почему то работает или не работает!?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 17:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нужен пример того, что работать вроде не должно, но работает (C++):

Посмотрите пожалуйста программу ,вроде все должно работать ,но что-то не так
#include <iostream> using namespace std; int main() { int a,b,c,i,z;...

Как работать с графикой DevC++. Нужен пример
Помогите, как поключить граф. драйвера, жду не дождусь когда уже начну работу с...

Syntax error хотя вроде быть не должно
Ругается на пропущенную ';' хотя она стоит. Output: ...

Не выводит новое окно, все вроде бы должно работать но не работает
Помогите пожалуйста найти ошибку <HTML> <HEAD> <META...

Нужен компаратор или что то вроде того
Код программы у меня очень маленький: String s = File.ReadAllLines("1.txt",...

Геометрический алгоритм.....что то вроде того
Два отрезка на плоскости заданные целочисельными координатами своих концов в...

57
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,201
Завершенные тесты: 1
30.01.2014, 10:02 #21
0x10, к посту номер 3.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
typedef struct
{
    char str[6];
    int num;
} NumberRepr;
void format(NumberRepr* number)
{
    sprintf(number->str, "%4d", number->num);
}
int main()
{
    NumberRepr number = {"",1025 };
    format(&number);
    printf("str: %s\n", number.str);
    printf("num: %d\n", number.num);
    return 0;
}
char str[4]; не хватает для записи строки
и она вылезает за пределы массива.
В результате портится переменная, которая лежит за строкой,
а это как раз num.
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
30.01.2014, 10:06 #22
zss, по просьбе автора давайте ответы будут под спойлером.
Чтобы ответ был полным
Чтобы ответ был полным, тут еще было бы неплохо объяснить почему строка из 4 символов не помещается в массив char[4] и почему значение num изменяется именно на единицу.


PS На всякий: не сомневаюсь, что Вы и так это все понимаете.
1
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,201
Завершенные тесты: 1
30.01.2014, 10:15 #23
Цитата Сообщение от 0x10 Посмотреть сообщение
было бы неплохо объяснить почему строка из 4 символов не помещается в массив char[4] и почему значение num изменяется именно на единицу
Давайте пока не будем открывать эту тайну.
Я думаю, что интересно самостоятельно додуматься.
Кто не сможет, попробуйте записать не 1025, а 1026, 1027,... 1023,1022
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
30.01.2014, 10:40 #24
zss,
Цитата Сообщение от zss Посмотреть сообщение
char str[6];
Цитата Сообщение от zss Посмотреть сообщение
char str[4]; не хватает для записи строки
переведи
Кликните здесь для просмотра всего текста
а если будет str[6] то может и не затереть
если компилятор выравняет структуру то фактически под str будет 8 байт( 2 запасных байта под выравнивание)
0
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
30.01.2014, 11:46  [ТС] #25
Цитата Сообщение от RussDragon Посмотреть сообщение
Как я помню, Смартопоинтеры появились раньше C++11, но часть их ввели именно в нем.
я написал за те которые появились в новом стандарте
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
01.02.2014, 17:29 #26
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
#include <stdio.h>
 
int fnctst(int a,int b, int c)
{
    return a+b+c;
}
 
void  fnc1()
{
   int a=5;
   int b=10;
   int c=15;
 
   int m=fnctst(a,b,c);
}
void   fnc2()
{
int a,b,c;
printf("%d %d %d\n",a,b,c);
}
 
 
int main(int argc, char * argv [])
{
   fnc1();
   fnc2();
 
   return 0;
}
VS2008 в release с выключенной оптимизацией
выдает
5 10 15
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.02.2014, 17:55 #27
ValeryS, а в чем проблема? На стеке же выделяются, ну выделили мы 3 int на стеке, затем (вышли из функции) вернулись на 3*sizeof(int) в стеке обратно, а затем (зашли в функцию fnc2()) - опять создали 3 int, в которых и записаны те значения.
Разве нет?
0
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,201
Завершенные тесты: 1
01.02.2014, 17:59 #28
Цитата Сообщение от ValeryS Посмотреть сообщение
VS2008 в release с выключенной оптимизацией
выдает
5 10 15
Срабатывает только для .c
а для .cpp нет
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
01.02.2014, 18:06 #29
nexen,
а теперь включи оптимизацию
или используй дебиг режим)
я использовал кучу онлайн компиляторов
и только этот показал похожий результат
можешь объяснить почему?

ТС просил прятать ответы

Добавлено через 1 минуту
zss,
повторяю: Релизная версия и оптимизация выключена
1
MickeyBlueEyes
Студент
120 / 131 / 39
Регистрация: 07.04.2011
Сообщений: 503
01.02.2014, 18:07 #30
> a=++b=++c=5;
В чём может заключаться магия?
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
01.02.2014, 18:26 #31
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
В чём может заключаться магия?
вот здесь описано
http://alenacpp.blogspot.ru/2005/11/sequence-points.html
точки следования

Добавлено через 16 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
и только этот показал похожий результат
ой а ссылку то я не вставил
http://www.compileonline.com/compile_cpp_online.php
1
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,241
02.02.2014, 01:31 #32
ValeryS,
Кликните здесь для просмотра всего текста
Переменные записываются в те же ячейки памяти. Кстати, ни вызов функции, ни названия переменных роли не играют.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
02.02.2014, 18:02 #33
Цитата Сообщение от Kastaneda Посмотреть сообщение
классика жанра
C++
1
std::cout << 0["Hello"] << std::endl;
Ну и немного более сложное:

C
#include <stdio.h>
 
int a[10][20];
 
int main (void)
{
  5[6[a]] = 1;
  return 0;
}
Добавлено через 1 минуту
Пример исходников, которые ведут себя по разному, если их компилировать в режимах Си и Си++
http://www.cyberforum.ru/cpp-experts...tml#post889587
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
05.02.2014, 08:34 #34
MrGluck,
а вот не всегда
вызывающая функция может стек почистить после второго вызова и в результате каша
разные компиляторы ведут себя по разному
я правда не пробовал с stdcall, когда стек чистит вызываемая функция
в любом случае это "грязный хак"
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
05.02.2014, 09:25 #35
http://www.cyberforum.ru/cpp-beginners/thread39082.html
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
05.02.2014, 13:12 #36
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот не всегда
вызывающая функция может стек почистить после второго вызова и в результате каша
разные компиляторы ведут себя по разному
не важно кто чистит стек (вызываемая / вызывающая), после вызова ф-ции стек должен быть в состоянии как до ее вызова. Поэтому вызов ф-ции здесь действительно не при чем. Разные результаты на разных компиляторах / уровнях оптимизации объясняются отличием в конечном коде. Вызов ф-ций может быть вообще исключен и все будет посчитано на регистрах.
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
05.02.2014, 13:34 #37
Пока все примеры выше очень даже обьяснимы, но не факт.
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
05.02.2014, 14:15 #38
Цитата Сообщение от Kastaneda Посмотреть сообщение
не важно кто чистит стек (вызываемая / вызывающая), после вызова ф-ции стек должен быть в состоянии как до ее вызова.
да это я увлекся
с аргументами попутал
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поэтому вызов ф-ции здесь действительно не при чем.
очень даже причем
без вызова функции и выделения формальных переменных, мы не можем сдвинуть указатель стека
напрямую с указателем стека Си не работает, даже на уровне ассемблерных вставок( хотя может сейчас может, но раньше обращение к SP блокировалось)
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разные результаты на разных компиляторах / уровнях оптимизации объясняются отличием в конечном коде.
Ну с этим то никто не спорит
Было б странно, если при одном и том же коде( бинарном), были бы разные результаты
"Но одна мысль, одна мысль, тревожит меня"(с) В Каверин "Два капитана"
Qt Cteator выдает такой ответ
15 4199990 5
т.е первый и последний правильно, средний мусор
Что он там со стеком делает?
в ассемблерный листинг не залазил
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 13:45 #39
Вот пример, обьяснимый, но не факт
C++
#include <iostream>
#include <list>
 
int main ()
{
    int a[] = {1,2,3};
 
    std::list<int>mylist(&a[0], &a[3]); // a[3] ?
 
    for (std::list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
}
Добавлено через 12 минут
интересно что будет если у меня только три байта доступной памяти в системе)

Добавлено через 1 минуту
не 3, а 12
0
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
06.02.2014, 14:00 #40
programina,
Кликните здесь для просмотра всего текста
так end() же возвращает указатель на элемент следующий за последним элементом, а не на последний. Следовательно все верно.
1
06.02.2014, 14:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 14:00
Привет! Вот еще темы с решениями:

генерация контента (или что-то вроде того)
привет :) сейчас буду излагать крайне сумбурно: проблема. есть бесплатный...

Посоветуйте какой-либо задачник или что-то вроде того, для усваивания
Начал потихоньку читать &quot;Полное руководство С#4.0&quot;. Но материал с трудом...

Скажите как мне на KeyUp или что-нибудь вроде того обнулить значение нажатой клавиши
Скажите как мне на KeyUp или что-нибудь вроде того обнулить значение нажатой...

Вывести строку в обратном порядке с учетом того, что первое слово должно начинаться с большой буквы
Вывести строку в обратном порядке с учетом того, что первое слово должно...


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

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

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