Попытка записи в буфер с использованием %n вызывает segfault, но чтение с использованием %p не приводит

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

У меня есть эксплуатируемый c код, который принимает пользовательский ввод. Я могу распечатать содержимое стека, с помощью $p которого выводится 10-е значение, хранящееся в стеке. Однако, когда я пытаюсь запустить ту же программу, но с $n ней segfaults . Что не имеет смысла. Segfaults означает, что я пытаюсь получить доступ к памяти, которая мне не принадлежит. Однако эта память действительно «принадлежит мне», поскольку я могу ее распечатать. Почему это происходит?

К сожалению, я не могу использовать почтовый индекс для него, потому что он предназначен для назначения. Поэтому я должен оставить этот вопрос абстрактным.

Ответ №1:

$n означает запись количества символов, напечатанных по адресу, на который указывает 10-й элемент стека, а не фактический 10-й элемент стека. Это означает, что если 10-й элемент не указывает на допустимую, доступную для записи память, чего, скорее всего, нет, то при попытке записи в него произойдет ошибка segfault.