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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
29.01.2014, 17:31     Нужен пример того, что работать вроде не должно, но работает #1
Есть у кого то парочка тем для размышления каких то конструкций, где вроде бы так делать нельзя, но почему то работает или не работает!?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 17:31     Нужен пример того, что работать вроде не должно, но работает
Посмотрите здесь:

Что-то вроде базы данных C++
Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелки совпадут C++
пример из книги не хочет работать. C++
Ошибки вроде бы нет, но работает не правильно! C++
Должно работать, но выдает ошибку C++
Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелка на циферблате совпадут C++
C++ что-то вроде события в консоли
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
6054 / 5657 / 1828
Регистрация: 18.12.2011
Сообщений: 14,448
Завершенные тесты: 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.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
30.01.2014, 10:06     Нужен пример того, что работать вроде не должно, но работает #22
zss, по просьбе автора давайте ответы будут под спойлером.
Чтобы ответ был полным
Чтобы ответ был полным, тут еще было бы неплохо объяснить почему строка из 4 символов не помещается в массив char[4] и почему значение num изменяется именно на единицу.


PS На всякий: не сомневаюсь, что Вы и так это все понимаете.
zss
Модератор
Эксперт С++
 Аватар для zss
6054 / 5657 / 1828
Регистрация: 18.12.2011
Сообщений: 14,448
Завершенные тесты: 1
30.01.2014, 10:15     Нужен пример того, что работать вроде не должно, но работает #23
Цитата Сообщение от 0x10 Посмотреть сообщение
было бы неплохо объяснить почему строка из 4 символов не помещается в массив char[4] и почему значение num изменяется именно на единицу
Давайте пока не будем открывать эту тайну.
Я думаю, что интересно самостоятельно додуматься.
Кто не сможет, попробуйте записать не 1025, а 1026, 1027,... 1023,1022
ValeryS
Модератор
6406 / 4872 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
30.01.2014, 10:40     Нужен пример того, что работать вроде не должно, но работает #24
zss,
Цитата Сообщение от zss Посмотреть сообщение
char str[6];
Цитата Сообщение от zss Посмотреть сообщение
char str[4]; не хватает для записи строки
переведи
Кликните здесь для просмотра всего текста
а если будет str[6] то может и не затереть
если компилятор выравняет структуру то фактически под str будет 8 байт( 2 запасных байта под выравнивание)
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
30.01.2014, 11:46  [ТС]     Нужен пример того, что работать вроде не должно, но работает #25
Цитата Сообщение от RussDragon Посмотреть сообщение
Как я помню, Смартопоинтеры появились раньше C++11, но часть их ввели именно в нем.
я написал за те которые появились в новом стандарте
ValeryS
Модератор
6406 / 4872 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
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
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.02.2014, 17:55     Нужен пример того, что работать вроде не должно, но работает #27
ValeryS, а в чем проблема? На стеке же выделяются, ну выделили мы 3 int на стеке, затем (вышли из функции) вернулись на 3*sizeof(int) в стеке обратно, а затем (зашли в функцию fnc2()) - опять создали 3 int, в которых и записаны те значения.
Разве нет?
zss
Модератор
Эксперт С++
 Аватар для zss
6054 / 5657 / 1828
Регистрация: 18.12.2011
Сообщений: 14,448
Завершенные тесты: 1
01.02.2014, 17:59     Нужен пример того, что работать вроде не должно, но работает #28
Цитата Сообщение от ValeryS Посмотреть сообщение
VS2008 в release с выключенной оптимизацией
выдает
5 10 15
Срабатывает только для .c
а для .cpp нет
ValeryS
Модератор
6406 / 4872 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
01.02.2014, 18:06     Нужен пример того, что работать вроде не должно, но работает #29
nexen,
а теперь включи оптимизацию
или используй дебиг режим)
я использовал кучу онлайн компиляторов
и только этот показал похожий результат
можешь объяснить почему?

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

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

Добавлено через 16 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
и только этот показал похожий результат
ой а ссылку то я не вставил
http://www.compileonline.com/compile_cpp_online.php
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5647 / 3126 / 353
Регистрация: 29.11.2010
Сообщений: 8,376
02.02.2014, 01:31     Нужен пример того, что работать вроде не должно, но работает #32
ValeryS,
Кликните здесь для просмотра всего текста
Переменные записываются в те же ячейки памяти. Кстати, ни вызов функции, ни названия переменных роли не играют.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,353
Записей в блоге: 26
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
ValeryS
Модератор
6406 / 4872 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
05.02.2014, 08:34     Нужен пример того, что работать вроде не должно, но работает #34
MrGluck,
а вот не всегда
вызывающая функция может стек почистить после второго вызова и в результате каша
разные компиляторы ведут себя по разному
я правда не пробовал с stdcall, когда стек чистит вызываемая функция
в любом случае это "грязный хак"
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,353
Записей в блоге: 26
05.02.2014, 09:25     Нужен пример того, что работать вроде не должно, но работает #35
Что делает данный код и зачем такое кому-нибудь может понадобиться?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
05.02.2014, 13:12     Нужен пример того, что работать вроде не должно, но работает #36
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот не всегда
вызывающая функция может стек почистить после второго вызова и в результате каша
разные компиляторы ведут себя по разному
не важно кто чистит стек (вызываемая / вызывающая), после вызова ф-ции стек должен быть в состоянии как до ее вызова. Поэтому вызов ф-ции здесь действительно не при чем. Разные результаты на разных компиляторах / уровнях оптимизации объясняются отличием в конечном коде. Вызов ф-ций может быть вообще исключен и все будет посчитано на регистрах.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
05.02.2014, 13:34     Нужен пример того, что работать вроде не должно, но работает #37
Пока все примеры выше очень даже обьяснимы, но не факт.
ValeryS
Модератор
6406 / 4872 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
05.02.2014, 14:15     Нужен пример того, что работать вроде не должно, но работает #38
Цитата Сообщение от Kastaneda Посмотреть сообщение
не важно кто чистит стек (вызываемая / вызывающая), после вызова ф-ции стек должен быть в состоянии как до ее вызова.
да это я увлекся
с аргументами попутал
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поэтому вызов ф-ции здесь действительно не при чем.
очень даже причем
без вызова функции и выделения формальных переменных, мы не можем сдвинуть указатель стека
напрямую с указателем стека Си не работает, даже на уровне ассемблерных вставок( хотя может сейчас может, но раньше обращение к SP блокировалось)
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разные результаты на разных компиляторах / уровнях оптимизации объясняются отличием в конечном коде.
Ну с этим то никто не спорит
Было б странно, если при одном и том же коде( бинарном), были бы разные результаты
"Но одна мысль, одна мысль, тревожит меня"(с) В Каверин "Два капитана"
Qt Cteator выдает такой ответ
15 4199990 5
т.е первый и последний правильно, средний мусор
Что он там со стеком делает?
в ассемблерный листинг не залазил
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 14:00     Нужен пример того, что работать вроде не должно, но работает
Еще ссылки по теме:

C++ Как работать с графикой DevC++. Нужен пример
Syntax error хотя вроде быть не должно C++
Меню должно снова работать после выбора одного из пунктов C++
Сервер выдаёт неправильный ответ, хотя, вроде, всё работает C++
C++ Сервер выдаёт неправильный ответ, хотя, вроде, всё работает

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5534 / 2568 / 234
Регистрация: 01.11.2011
Сообщений: 6,343
Завершенные тесты: 1
06.02.2014, 14:00     Нужен пример того, что работать вроде не должно, но работает #40
programina,
Кликните здесь для просмотра всего текста
так end() же возвращает указатель на элемент следующий за последним элементом, а не на последний. Следовательно все верно.
Yandex
Объявления
06.02.2014, 14:00     Нужен пример того, что работать вроде не должно, но работает
Ответ Создать тему
Опции темы

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