183 просмотра
От 30 мая 2023

Вопросы для собеседования Си-разработчика

1. Какого типа значение возвращает main()?

Скомпилируется ли следующий код? Если да, то какие проблемы могут возникнуть? #include <stdio.h> void main(void) { char *ptr = (char*)malloc(10); if(NULL == ptr) { printf("\n Malloc failed \n"); return; } else { // Do some processing free(ptr); } return; } Этот код скомпилируется без ошибок, но с варнингом (на большинстве компиляторов) о том, что значение, возвращаемое функцией main(), должно иметь тип int, а не void. Тип int позволяет программам возвращать код статуса, что очень важно, когда программа выполняется как часть скрипта, и внутри скрипта есть условия, которые зависят от результата выполнения программы.

2. Что такое указатель?

Указатель — это переменная, которая хранит адрес памяти объекта. Указатели широко используются в C и C++, например, в подобных случаях: 1. Для выделения новых объектов в куче, 2. Для передачи функций другим функциям 3. Для итерации элементов в массивах или других структурах данных.

3. Различия sprintf() и printf()?

Метод sprint() работает аналогично методу printf() за исключением одной небольшой детали. Метод printf() записывает вывод на экран консоли, тогда как метод sprintf() записывает вывод в массив символов.

4. Расскажите про порядок аргументов printf()

#include <stdio.h> int main(void) { int a = 10, b = 20, c = 30; printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2)); return 0; } Вопрос: Что выведет данный код? Ответ: Программа выведет следующее: 110..40..60 Несмотря на то, что аргументы функции printf отображаются слева направо, вычисляются они справа налево. Однако, порядок вычисления аргументов стандартом не определен. Аргументы кладутся в стек справа налево, но порядок их вычисления может быть иным. В Java, например, такой проблемы нет.

5. Расскажите про функцию gets()

В приведенной программе есть проблема. Можете её найти? #include <stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; } Скрытая проблема в этом коде – это использование функции gets(). Эта функция принимает строку со стандартного ввода без проверки размера буфера, в который будет помещена эта строка. Это запросто может привести к переполнению буфера. В данном случае лучше использовать другую стандартную функцию – fgets(). Дополнение: gets() является deprecated.

6. Расскажите про функцию strcpy()

Приведенный код реализует простейшую защиту по паролю. Можно ли вы взломать эту защиту, не зная пароля? #include <stdio.h> int main(int argc, char *argv[]) { int flag = 0; char passwd[10]; memset(passwd,0,sizeof(passwd)); strcpy(passwd, argv[1]); if(0 == strcmp("LinuxGeek", passwd)) { flag = 1; } if(flag) { printf("\n Password cracked \n"); } else { printf("\n Incorrect passwd \n"); } return 0; } Логику кода аутентификации, приведенного выше, можно обойти при помощи уязвимости в функции strcpy(). Эта функция копирует пароль, предоставленный пользователем, в буфер ‘passwd’, не проверяя, достаточно ли в этом буфере места. Предположим, что пользователь введет случайный пароль, имеющий длину, достаточную для того, чтобы заполнить как буфер ‘passwd’, так и перезаписать область памяти, содержащую изначальное значение 0 переменной flag. В этом случае, даже если сравнение введенной строки и пароля не пройдет, то все равно проверка флага, который изначально имел нулевое значение, станет ненулевым, и таким образом, защита будет “взломана”. К примеру: $ ./psswd aaaaaaaaaaaaa Password cracked Здесь можно видеть, что хотя введенный пароль был некорректен, но программа все равно была взломана через ошибку переполнения буфера. Для защиты от подобных случаев следует пользоваться функцией strncpy().

7. Расскажите про функцию free()

Поддержи проект и получи доступ ко всему контенту всего за 290

8. Расскажите про функции atexit() и _exit()

Поддержи проект и получи доступ ко всему контенту всего за 290

9. Что не так со следующей функцией?

Поддержи проект и получи доступ ко всему контенту всего за 290

10. Течёт ли тут память?

Поддержи проект и получи доступ ко всему контенту всего за 290

11. void* и структуры C

Поддержи проект и получи доступ ко всему контенту всего за 290

12. Операторы * и ++

Поддержи проект и получи доступ ко всему контенту всего за 290

13. Реализуйте процесс, изменяющий свое имя

Поддержи проект и получи доступ ко всему контенту всего за 290

14. Адрес локальной переменной

Поддержи проект и получи доступ ко всему контенту всего за 290

15. В каких случаях используется ключевое слово static?

Поддержи проект и получи доступ ко всему контенту всего за 290

16. Зачем используется volatile?

Поддержи проект и получи доступ ко всему контенту всего за 290

17. Может ли указатель быть volatile?

Поддержи проект и получи доступ ко всему контенту всего за 290
Хочешь стать частью сообщества Девстанции?
Вступай в наш чат в Telegram

Также в этой категории

Шпаргалка
  26 вопросов

Шпаргалка по вопросам о C++

Вопросы для собеседования C++ разработчика

272 просмотра
От 29 января
Задачник
  32 задачи

Топ 35 задач с собеседований по C++

Разбор решений для алгоритмических задач с собеседований по C++

458 просмотров
От 25 февраля

Вам может быть интересно

Викторина
  26 вопросов

Викторина по Python - Junior

Вопросы на собеседовании по Python для Junior-позиции

54 просмотра
От 30 мая 2023
Шпаргалка
  7 вопросов

Коллекция полезных команд для Docker

Большая шпаргалка по всем командам Docker

200 просмотров
От 12 октября 2023
Викторина
  12 вопросов

Викторина по Python - Middle/Senior

Продвинутые вопросы для собеседования Python-разработчика

22 просмотра
От 30 мая 2023
Шпаргалка
  34 вопроса

Шпаргалка по вопросам о Python

Вопросы для собеседования Python-разработчика

562 просмотра
От 30 января
Шпаргалка
  11 вопросов

Теория шардинга баз данных

О распределении данных между серверами

243 просмотра
От 10 октября 2023
Викторина
  20 вопросов

Викторина по Django - Junior/Middle

Базовые вопросы с собеседования по Django

15 просмотров
От 2 июня 2023

Топ тредов

Gravatar for 9tokio
Tokio:
то что раньше было бесплатным теперь платное - вот это я понимаю

Последнее сообщение:
Логотип Девстанции
Девстанция:
Спасибо за поддержку проекта :) Повышение качества контента - один из важнейших приоритетов. Этому м...
3 сообщения
213 просмотров

Логотип Девстанции
Девстанция:
Поиск людей для совместной разработки IT-стартапов

Последнее сообщение:
В этом треде пока нет сообщений
0 сообщений
107 просмотров

Логотип Девстанции
Девстанция:
Какой язык программирования выбрать в качестве первого?

Последнее сообщение:
Gravatar for 2kokke
Kokke:
Python или JS - универсально. Но по уму надо бы с чего-то строгого начинать и достаточно низкоуровне...
1 сообщение
139 просмотров

Все категории