int i = 15;
printf("%i");
Локальные переменные
Код:
В билдере все супер, а в студии не работает - выдает 0 вместо 15
Опция Buffer Security Check(/GS) отключена
Где локальная переменная i? Почему выводиться 0? :)
Код:
int i = 15;
printf("%i");
printf("%i");
В билдере все супер, а в студии не работает - выдает 0 вместо 15
Опция Buffer Security Check(/GS) отключена
Где локальная переменная i? Почему выводиться 0? :)[/QUOTE]
Вообще-то в Builder'е тоже не "все в порядке". Чуть-чуть исправьте свой код и вы в этом убедитесь.
Код:
int i = 15;
int b = 5;
printf("%i");
int b = 5;
printf("%i");
Должно быть так
Код:
int i = 15;
printf("%i", i);
printf("%i", i);
Советую почитать описание функций ввода/вывода.
И не тривиальный!
Вопрос может и не тривиальный, но уж новичка-то точно.
[QUOTE='
i на своем месте. Вы путаете имя переменной и спецификатор формата.
Выводится то число, которое лежит на стеке. Плюс к этому VC++ может проверять параметр va_list и при несовпедении числа спецификаторов с числом параметров выводить некое дефолтовое значение вместо того чтобы лезть на стек. Что из этого происходит на самом деле - вопрос исследования конкретной CRT.
Цитата:
Выводится то число, которое лежит на стеке. Плюс к этому VC++ может проверять параметр va_list и при несовпедении числа спецификаторов с числом параметров выводить некое дефолтовое значение вместо того чтобы лезть на стек. Что из этого происходит на самом деле - вопрос исследования конкретной CRT.
А это уже что-то от чего можно отолкнуться
Я просто не нашел ничего врозумительно по данной теме - сейчас продолжим поиски)
Люблю покопаться в мелочах)
И не тривиальный![/QUOTE]
Так я этого и не сказал. Хотя, признаться, так и подумал.
Не понял из постановки вопроса, что вы ищите различия в реализациях этой функции в Builder'e и в VS.
В VS как-то безопасно реализованна функция printf?
Так что не реализует ее "старое поведение"?
Старое поведение:
Если при вызове printf аргументов в стеке меньше, чем требуется для обработки строки форматирования, то недостающие аргументы читаются со стека, несмотря на то, что на стеке находятся произвольные данные (не имеющие отношения к работе printf).
З,Ы, В нашем случае данные не имеющие отношения к printf - это локальная переменная i (сорри, что ее так назвал и всех ввел в заблуждение :) )