1090 просмотров
от 4 июня 2024
C/C++

Вопросы и ответы с собеседований по C

Вопросы и ответы с собеседований C-разработчиков. Указатели, функция main(), особенности работы с gets(), strcpy(), free(), разница между sprintf() и printf(), утечки памяти, статические сущности и многое другое.

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 позволяет программам возвращать код статуса, что очень важно, когда программа выполняется как часть скрипта, и внутри скрипта есть условия, которые зависят от результата выполнения программы.

Комментарии
0/3000
2

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

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

Комментарии
0/3000
3

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

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

Комментарии
0/3000
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, например, такой проблемы нет.

Комментарии
0/3000
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.

Комментарии
0/3000
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().

Комментарии
0/3000
7

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

Следующая программа вылетает с ошибкой сегментации, если ввести freeze. Однако, если ввести zebra, то все будет хорошо. Почему? #include <stdio.h> int main(int argc, char *argv[]) { char *ptr = (char*)malloc(10); if(NULL == ptr) { printf("\n Malloc failed \n"); return -1; } else if(argc == 1) { printf("\n Usage \n"); } else { memset(ptr, 0, 10); strncpy(ptr, argv[1], 9); while(*ptr != 'z') { if(*ptr == '\0') break; else ptr++; } if(*ptr == 'z') { printf("\n String contains 'z'\n"); // Do some more processing } free(ptr); } return 0; } Здесь проблема заключается в том, что код изменяет адрес указателя ptr (путем инкремента переменной ptr) внутри цикла while. Когда пользователь вводит zebra, цикл while завершается без единой итерации, поэтому адрес, переданный функции free(), будет точно такой же, какой был присвоен функцией malloc(). Однако, в случае с freeze, значение переменной ptr изменяется внутри цикла while, что приводит к передаче неправильного адреса в функцию free() и ошибке сегментации.

Комментарии
0/3000
Авторизуйтесь, чтобы открыть доступ к контенту
9

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

10

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

11

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

12

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

13

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

14

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

15

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

16

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

17

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

18

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

Вопросники по C/C++
C/C++
26 вопросов
Вопросы и ответы с собеседований по C++
1314 просмотров
C/C++
17 вопросов
Вопросы и ответы с собеседований по C
1090 просмотров
Хотите заработать на создании вопросников?
Стать редактором
Смежные категории
Базы данных
11 вопросов
Вопросы с собеседований про шардинг баз данных
1222 просмотра
Computer Science
13 вопросов
Вопросы и ответы с собеседований про ООП
1133 просмотра
Docker
7 вопросов
Коллекция полезных команд для Docker
1272 просмотра
Computer Science
28 вопросов
Объяснение паттернов проектирования с примерами
1341 просмотр
Базы данных
10 вопросов
Вопросы с собеседований о репликации баз данных
1407 просмотров
Computer Science
11 вопросов
Вопросы и ответы про интернет-протоколы
1359 просмотров
Рекомендуем
Computer Science
15 вопросов
Вопросы и ответы с собеседований по DDD
1445 просмотров
Computer Science
13 вопросов
Вопросы и ответы с собеседований про ООП
1133 просмотра
Computer Science
11 вопросов
Вопросы и ответы про интернет-протоколы
1359 просмотров
Базы данных
60 вопросов
Вопросы и ответы с собеседований по SQL
2193 просмотра
Computer Science
12 вопросов
Вопросы с собеседований про операционные системы
1018 просмотров
Computer Science
28 вопросов
Объяснение паттернов проектирования с примерами
1341 просмотр
Другие разделы

Лента

Активность пользователей Девстанции

Перейти к ленте

Лидеры

Рейтинг самых результативных пользователей сообщества

Перейти к лидерам

Треды

Общение по интересам и связь с разработчиками

Перейти к тредам

Задачи

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

Перейти к задачам

Вопросы

Ответы на вопросы с технических собеседований

Вы находитесь здесь

Викторины

Интерактивные викторины по вопросам с собеседований

Перейти к викторинам
Мы в Telegram
Новости проекта, общение с разработчиками, общение по интересам - присоединяйтесь!