Ответы пользователя по тегу C
  • Сhar *x = "xxx" - динамически выделенная память?

    terrier
    @terrier
    В коде выше память выделяется динамически?

    Нет, не выделяется. Вам отдается указатель внутрь одного из элементов массива request.envp. Собственно поэтому вы и не должны изменять этот результат.
    Ответ написан
    Комментировать
  • Можно ли написать AAA-игру на языке программирование Си?

    terrier
    @terrier
    Можно ли написать AAA-игру на языке программирование Си?

    Ну, гм, в принципе, конечно, да - Quake 1/2/3, например, написаны на C. Но сейчас для такого рода игр стандарт де-факто - C++
    Ответ написан
    2 комментария
  • Как перейти с C++ на C?

    terrier
    @terrier
    Кернигана и Ритчи уже прочитали? Тогда заполируйте это книжкой "21st century C" и к разработке на С вы готовы. Сам язык, как вы правильно заметили относительно компактный.
    Ответ написан
    Комментировать
  • Можете объяснить данный фрагмент кода?

    terrier
    @terrier
    Во-первых, как pos может быть <= 0, это же невозможно.

    Ошибка в определении типа параметров функции привела к вот таким странностям. Довольно очевидно, что pos, позиция символа в строке - это беззнаковая переменная и проверка на "меньше нуля" излишняя (и вот в остальные функции ее разумно вставлять не стали). Все вот эти
    int findspace(int pos);
    int newpos(int pos);
    int exptab(int pos);
    должны принимать и возвращать беззнаковое, но видимо про эти типы Тондо и Гимпел еще не дочитали.
    Ответ написан
    4 комментария
  • Почему возникает проблема с указателем в C?

    terrier
    @terrier
    Когда мы заходим в функцию ptrTest указатель testString указывает на начало некоторой области памяти, в которой, как мы понимаем лежит строка "qwe rty uio" (а за ней нуль-терминатор).
    Функция printf, как нам указывает, например, документация своим первым параметром принимает как раз указатель на строку, которую нужно вывести. По этому первый пример работает как работает (правильно).
    Когда вы разыменовываете указатель testString (который, напомню указывает на начало строки "qwe rty uio", то есть на букву "q") вы получаете ascii-код первой буквы этой строки. В вашем случае 0x71. Вы передаете его в функцию printf, интерпретируя как значение адреса некоторой строки, однако 0x71 - адрес невалидный. Вот потому и ошибка доступа.

    В коде я хотел вывести указатель, а потом получить значение, на которое он указывает, путём разыменования.

    Само значение указателя ( то есть число, обозначающее адрес в памяти ) выводим так
    printf("%p\n", testString)
    Значение, на которое он указывает
    printf("%c", *testString)
    - указывает, как мы помним на букву "q"
    Ответ написан
    Комментировать
  • Си: Почему не выходит ошибка Segmentation fault при выполнении этого кода?

    terrier
    @terrier
    Обращение по адресу памяти, который не был выделен - это Undefined behaviour. Частным случаем такого поведения является Segmentation Fault или вывод значения 1 или все что угодно другое. Вы не можете ожидать какого-то определенного поведения от всей програмы, если в ней есть undefined behaviour.
    Ответ написан
    1 комментарий
  • Почему C всё еще актуален?

    terrier
    @terrier
    Пусть ответит один из наиболее компетентных в практическом смысле C-программистов: harmful.cat-v.org/software/c++/linus

    tl;dr : С более портабелен, более эффективен, проще отлаживается и не привязывает к неэффективным моделям
    Ответ написан
    Комментировать
  • Какие есть проекты на Си, которые можно использовать для изучения языка?

    terrier
    @terrier
    GNU coreutils
    git.savannah.gnu.org/cgit/coreutils.git/tree
    Это те самые ls, chown, uniq, с которыми люди сталкиваются каждый день работая в консоли. Множество маленьких "проектиков", обильно прокомментированных и уже хорошо оттестированных "на кроликах". Каждая конкретная утилитка выполняет маленькую понятную задачку, но в реальном коде вскрываются множество тонкостей, о которых в базовых учебниках не пишут, а знать надо.
    Ответ написан
    1 комментарий