Проблема в следующей строке:
scanf("%d\n", age);
scanf ожидает аргументы указателя - это единственный способ, которым функции могут изменять параметры в C. Чтобы исправить это, вам необходимо:
scanf("%d\n", &age);
, который передает адрес age, который теперь является указателем (указатель - это переменная, содержащая адрес в другой области памяти).
Что касается этого:
char* name = "";
Ой-ой-пожалуйста-не!Хорошо, мне нужно объяснить.Вы просили указатель на тип символа, но для всех, все, что у вас есть, это символ, а не целая строка.Это верно, не хватает места.Почему C позволяет вам это сделать?Ну, C в основном переносимый ассемблер, так что вы можете писать где угодно в памяти (точнее, вы можете попробовать, и компилятор не согласится, но операционная система может и, вероятно, будет).
Что выдля этого нужно прочитать о распределении памяти, используя malloc
, чтобы выделить некоторое пространство, в противном случае я могу ввести массивную строку, и она будет помещена по адресу имени.
Это может, хотя и неозначает, приведет к уязвимости на основе стека.Что, стеки? Да.Стек - это структура FILO, и каждый раз, когда вы вызываете функцию, вы добавляете пространство в стек для своего адреса возврата и аргументов функции, а также часто переменных области действия функции.
Где это становится проблемой, еслиВы не проверяете входные размеры.Затем я могу записать огромные значения в ваш стек, включая исполняемый код ... см. Переполнение буфера .
Итак, как мне это смягчить, как я слышал, вы говорите, просто жаждя не реализовыватьпрограммные уязвимости?Вы используете функции, которые позволяют вам указать размер входного буфера и считывать данные в буфер определенного размера, и переходите оттуда.Вот и все.Это просто.
См. Этот вопрос: чтение строки в C .