#c
Вопрос:
Существует ли способ каким — либо образом манипулировать функцией C
, например, мы знаем, что функция C printf() возвращает количество символов, напечатанных на консоли. Итак, есть ли какой-либо способ, которым я могу получить количество символов, но не разрешаю функции printf() печатать на консоли. используя ту же функцию printf() из stdio.h
Я знаю return
, что это последнее утверждение, которое выполняется в функции, следовательно, то, о чем я спрашиваю, может быть невозможным, но я действительно хочу услышать от сообщества, т. е. возможна ли моя гипотеза, т. е. манипулирование функцией c или нет?
Комментарии:
1. Вы имеете в виду во время выполнения?
Ответ №1:
Если у вас есть доступ к исходному коду и вы можете перекомпилировать его со своими изменениями, то, конечно, вы можете это сделать. Подумайте об этом:
int foo(int a, int b)
{
int c = 4;
int d = 8;
int f = c * a;
int g = d * b;
int h = f g;
return h;
}
Если вы хотите сохранить значение f
, есть несколько способов сделать это: 1) вы входите в стек с помощью встроенной сборки (непереносимой, ненадежной), 2) вы изменяете код, чтобы предоставить доступ к переменной. Примечания к «максимальному значению стека»: что делать, если в архитектуре нет стека? Что делать, если все значения находятся в регистрах? Что делать, если компилятор оптимизировал все вызовы функций для встроенных вызовов? Что, если…?
Потому что, если вы посмотрите на функцию со стороны, вся функция… это:
int foo(int a, int b);
Вы можете получить из него целое число, если передадите ему два целых числа в качестве аргументов. Это все, что вы можете сделать с помощью API. В C вы никак не можете получить значение f
или g
.
По аналогии, f
и g
есть printf
внутреннее состояние, и вы не можете получить к нему доступ. Функции предназначены для работы в качестве идеальных черных ящиков: они дают вам вывод на основе ваших входных данных, но как это делается, не имеет значения.
Комментарии:
1. Ладно, думаю, я понял, в чем дело . вы говорили о пике в стеке и т. Д. можете ли вы предложить мне какой-либо учебник, курс или ресурс, который может научить меня этой внутренней работе. Это было бы действительно полезно для меня, как для новичка.
2. Есть книга по сборке под названием » Программирование с нуля » Джонатана Бартлетта. Настоятельно рекомендуется, если вы хотите узнать больше о программировании низкого уровня (например, о непосредственном управлении стеком).