Хорошо, это будет несколько длинно.
Итак, у меня есть программа, которая использует два параметра формата %n
в инструкции printf()
. %n
по сути записывает данные, ничего не отображая... Поэтому, когда моя функция форматирования встречает параметр %n
, она записывает количество байтов, которые были записаны функцией, по адресу соответствующего аргумента функции.
#include <stdio.h>
#include <stdlib.h>
int main() {
int A = 5, B = 7, count_one, count_two;
printf("The number of bytes written up to this point X%n is being stored in
count_one, and the number of bytes up to here X%n is being stored in
count_two.\n", &count_one, &count_two);
printf("count_one: %d\n", count_one);
printf("count_two: %d\n", count_two);
printf("A is %d and is at %08x. B is %x.\n", A, &A, B);
exit(0);
}
вывод программы:
The number of bytes written up to this point X is being stored in count_one,and the number of bytes up to here X is being stored in count_two.
count_one: 46
count_two: 113
A is 5 and is at bffff7f4. B is 7.
Что касается этого printf
printf("A — это %d и находится в %08x. B — это %x.\n", A, &A, B);
Теперь аргументы помещаются в стек в обратном порядке: сначала значение B, затем адрес значения A, затем адрес значения A и, наконец, адрес строки формата...
Теперь, если только два аргумента помещаются в стек со строкой формата, которая использует три параметра формата?
Поэтому я удалил последний аргумент в приведенном выше коде, чтобы он соответствовал этому аргументу printf().
printf("A — это %d и находится в %08x. B — это %x.\n", A, &A);
и что происходит, когда я компилирую и выполняю...
The number of bytes written up to this point X is being stored in count_one, and the number of
bytes up to here X is being stored in count_two.
count_one: 46
count_two: 113
A is 5 and is at bffffc24. B is b7fd6ff4
Итак, я понимаю это b7fd6ff4
, что это? Что это означает применительно к фрейму стека для функции форматирования?
Любое понимание или объяснение будут высоко оценены.
printf()
имеет недопустимую строку формата (первый параметр). Теперь, если бы эта 3-строчная строка была на одной строке... - person user3629249   schedule 30.11.2017printf()
должен быть «%p», а не «%08x». - person user3629249   schedule 30.11.2017"%08x"
предназначен для печатиunsigned
, а не указателей."%p"
предназначен для печатиvoid*
указателей. - person chux - Reinstate Monica   schedule 30.11.2017