Pull to refresh

Comments 19

Ещё не суйте сырые руки в щиток.
Но! Если написать маркером "UNSAFE" на руке, то можно. Новомодные языки такое практикуют.

Далеко не всегда.

Очень часто на Си пишут люди, которых нарекли программистамми и дали задание писать для микроконтррллеров.

В большинстве случаев на Си пишут для встраиваемых систем, а у них объем памяти фиксирован и заранее известен, поэтому нет необходимости использовать динамическое выделение памяти. По этой же причине можно использовать глобальные переменные и полностью отказаться от указателей. Большая часть описанных в статье проблем теряют актуальность.

Вы не поверите, но практически всё окружение и пользовательские программы в UNIX, почти все операционные системы, их компиляторы, многие научные и иные библиотеки написаны на C.

 TIOBE
TIOBE

C по популярности такой же как и Java.

 TIOBE
TIOBE

Вы устали от:❌ Тайных утечек памяти, которые пожирают ресурсы.

❌ Загадочных падений программы без объяснения причин.

❌ Указателей-призраков, стреляющих в вас из темноты сегфолтов.

Для кого:

• Начинающие разработчики, которые хотят писать код, а не баги.

• Те, кто считает, что free() — это про свободу, а не про память.

• Все, кто устал гуглить «почему Си опять вылетает».

Взаимоисключающие параграфы, тем более после прочтения статьи. Любой уважающий себя автор сишного букваря (или цикла уроков) эти "ошибки" озвучит в начале соответствующих тем.

ChatGPT мне по этому промту (название статьи) информации больше накидал и подробнее. Только он не боялся слова "разыменование" и не путал тестирование с профилированием и отладкой.

Выход за границы массива

Как избежать:

  • Используйте константы

Так?

#define ARRAY_SIZE 10
/* some code */
int my_best_array[ARRAY_SIZE] = {0};
for(int i = 0; i <= ARRAY_SIZE; i++)
  printf("%d\n", my_best_array[i]);
/* some code else */

или sizeof для определения размера:

Сколько нулей выведет?

void print_my_best_array(int best_array[])
{
    for(int i = 0; i < sizeof(best_array); i++)
      printf("%d\n", best_array[i]);
}

int main()
{
    int my_best_array[10] = {0};
    print_my_best_array(my_best_array);
    return 0;
}

Полезные ресурсы:

Можно еще ссылок на документацию к GCC и Clang дать, в статье же про Compiler Warnings было.

Ну и K&R отлично подойдет "для тех, кто считает, что free() — это про свободу".

Никогда не освобождаю память (и у меня все работает). Как? Неужели стоит написать статью об этом? #NothingIsFree

Когда я был неопытный и Питон ещё не изобрели, а консольные утилитки писать хотелось, то делал их на С и память не освобождал. Зачем? Процесс короткоживущий, данный не много грузит и операционка сама за процессом всё подчистит.

Использовал, конечно. Но был молодой да и было много свободного времени.

Как распознать gpt-писанный текст:

  • Элементарные, я бы сказал, клишированные кейсы

  • Списки, списки, стены списков

  • Обезличенная подача

  • Вокруг да около, обо всем и ни о чем

Ставьте минус, гоните в шею

По поводу кто освобождает память, когда она возвращается из функции. Если это библиотечное выделение памяти, то тот кто создаёт, то же должен и предоставить метод для освобождения. А не просить используйте free(). Как редкий случай, в один прекрасный момент может поменяться способ аллокации.

Хорошая статья, я как раз изучию язык си

Sign up to leave a comment.

Articles