10 вопросов по С. part2 - C (СИ)

Узнай цену своей работы

Формулировка задачи:

1) почему не равнозначны записи x = 0x10l и х = 0х1е1l ? Хотя int x = 10 == int x = 1e1; 2) Все правила при применении операции приведения типа. Объяснить пример: unsigned int a = 100; signed int b = -99; printf ("%d %d %d", a, b, a > b); 3) char* str = "qwerty"; str [5] = 'Y'; По идее идет попытка изменения значения константной строки. Но почему ошибка не обнаружилась на этапе компиляции, например как здесь: const char arr [] = "qwerty"; *arr = '5'; *И вообще, отчего зависит, когда будет обнаружена ошибка (на этапе компил. или уже в процессе выполнения) ? 4) отрицание (воскл. знак) битовая операция? Как происходит преобразование не нуля в 0 и 0 в 1? 5) long double. Почему его размер не представляется в виде степени двойки?????? (у меня зайзоф 12!). Все, которые не взять: чар, шорт, указатель, лонг лонг... -- представляются в виде 2^n, а он нет. И вообще, почему все типы (кроме ldouble) представляются в виде 2^n (с чем этто связано)? 6) a) void f1 (int){;} main () {void (*b) (int) = f1;} Все работает. b) А если написать вместо определения ф1 только ее прототип, то андефенид референс. Как это отслеживается? 7) Что означает запись: void *b [10] (int); ? без массива, ф-ия, возвращающая указатель на воид (кстати, что из себя представляет указатель на воид?) если *b [10] взять в скобки, то это массив ук. на ф-ию. А конкретно такая запись как трактуется? 8) Почему нижеследующий код иногда правильно работает (допущена ошибка к доступу несуществ. эл массива)? void f1 (int); main () { void (*b []) (int) = {f1, f1, f1}; (b [3]) (5); } void f1 (int a) {printf ("Hello world!");} 9) volatile. что это такое и с чем его едят. 10) различия между new и malloc () / calloc ()

Решение задачи: «10 вопросов по С. part2»

textual
Листинг программы
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }
 
        return (p);
        }

Объяснение кода листинга программы

  1. Передача размера в оператор new
  2. Попытка выделения памяти с помощью malloc
  3. Проверка, не равно ли выделенное значение нулю
  4. Если выделенное значение равно нулю, попытка вызова _callnewh
  5. Если _callnewh вернул ноль, проверка на отсутствие памяти
  6. Если проверка на отсутствие памяти вернула значение, инициализация объекта std::bad_alloc
  7. Восстановление контекста предыдущего броска исключения
  8. Возврат выделенного значения
  9. Вызов _RAISE с переданным объектом исключения
  10. Возврат нулевого значения при успешном выделении памяти

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы