Управление функцией C

#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. Есть книга по сборке под названием » Программирование с нуля » Джонатана Бартлетта. Настоятельно рекомендуется, если вы хотите узнать больше о программировании низкого уровня (например, о непосредственном управлении стеком).