C question
Types
#include <stdio.h>
#include <stdint.h>
int main(void) {
int dir = -12;
printf("%u\n", dir);
}
#include <stdio.h>
#include <stdint.h>
int main(void) {
int32_t dir = 0x01 << 2;
printf("%d\n", dir);
}
Q3: Является ли результат операции сдвига зависимым от порядка байтов в аппаратной архитектуре?
++A|Нет, компилятор учитывает порядок байтов в архитектуре++
Q4: Что означает uint64_t * foo = NULL ?
++A|Указатель на переменную размерности uint64_t, либо на массив переменных, но инициалированный в значение 0x0++
Q: Отличается ли результат sizeof(char*) и sizeof(int64_t*)?
++A|На одной и той же архитектуре - нет, это указатели на память и имеют одинаковый размер++
Memory
Q12: Является ли функция выделения памяти стандартом и каким?
++A|Определение функция malloc() является входит в стандарт ISO, но реализация может быть своей++
#include <stdio.h>
#include <stdlib.h>
struct descr {
int id;
};
int main(void) {
struct descr* d;
for (int i = 0; i < 1024; i++) {
d = malloc(sizeof(struct descr));
d->id = i;
printf("%d\n", d->id);
}
}
++A|Программа корректна, но низкого качества: отсутствует вызов free(), освобождающий память, отсутствует проверка на возвращаемое malloc() значение ++
Q14: Какие основные области памяти программы вы знаете, и для чего они предназначены?
++A|Heap, stack, data, bss, text++
Q15: В какой области памяти располагаются переменные и в каких случаях?
++A|Статические не инициализированные и инициализированные в сегментах BSS и DATA (RODATA), динамические в стеке, распределенные с помошью malloc() в нeap ++
#include <stdio.h>
void print(void) {
char* foo = "qwerty123456";
printf("%s\n", foo);
}
int main(void) {
print();
}
Q17: Может ли быть в одной программе несколько стеков памяти?
++A|Да, например с помощью makecontext() ++
Arrays
#include <stdio.h>
int main(void) {
char* str = "qwerty123456";
printf("%s\n", str[3]);
}
Q22: Какова длина массива, объявленного char* str = “qwerty”?
++A| 7 байт, определение содержит синтаксический сахар для определения строки++
Q23: Какова длина массива, объявленного char* str = “йцукенг”?
++A| В зависимости от типа UTF, используемого для ввода, плюс финализатор строки '\0'++
Structures
#include <stdio.h>
#include <stdint.h>
struct descr {
int32_t id;
int64_t n1;
int64_t n2;
};
int main(void) {
printf("%lu\n", sizeof(struct descr));
printf("%lu\n", sizeof(int32_t) + sizeof(int64_t) * 2);
return 0;
}
Funcions
Q41: Как вернуть код ошибки типа int из функции?
++A|Либо возвратом результата, либо передавая ссылкe на переменную++
#include <stdio.h>
#include <stdint.h>
void rotate(int32_t* var) {
var += 1;
}
int main(void) {
int32_t dir = 12;
rotate(&dir);
printf("%d\n", dir);
}
#include <stdio.h>
#include <stdint.h>
struct descr {
int32_t dir;
};
void rotate(struct descr* descr) {
descr->dir++;
}
int main(void) {
struct descr d;
d.dir = 12;
rotate(&d);
printf("%d\n", d.dir);
}
#include <stdio.h>
#include <stdint.h>
void rotate1(int32_t* var) {
var += 1;
}
static void rotate2(int32_t* var) {
var += 1;
}
int main(void) {
int32_t dir = 12;
rotate1(&dir);
rotate2(&dir);
printf("%d\n", dir);
}
#include <stdio.h>
typedef struct {
char* message;
} descr_t;
void run(const descr_t* descr) {
descr->message = "qwerty";
}
int main(void) {
descr_t descr;
run(&descr);
printf("%s\n", descr.message);
return 0;
}
Operation system
Mutexes and semaphores
Q62: В чем основные отличие семафоров и мютексов?
++A| Семафор обладает N количеством состояний, и множество потоков могут изменять его состояние, мютекс обладает только двумя состояниями++
IPC
Q71: Какие виды коммуникации между процесссами вы знаете?
++A|Разделяемая память, семафоры, мютексы, сокеты, сигналы, каналы (pipes)++