Почему мы должны бросить то, что возвращает malloc?

Теперь, когда у нас есть лямбда-выражения и анонимные методы в C#, я использую, делегирует намного больше. В C# 1, где у Вас всегда должен был быть отдельный метод реализовать логику, с помощью делегата часто, не имел смысла. В эти дни я использую делегатов к:

  • Обработчики событий (для GUI и больше)
  • Стартовые потоки
  • Обратные вызовы (например, для асинхронных API)
  • LINQ и подобный (Список. Найдите и т.д.)
  • Где-либо еще, где я хочу эффективно применить "шаблонный" код с некоторой специализированной логикой внутри (где делегат обеспечивает специализацию)
6
задан haccks 20 November 2013 в 11:21
поделиться

6 ответов

Не знаете. void * будет неявно приводить к тому, что вам нужно на C. См. Также C FAQ о том, почему вы хотели бы явно избегать приведения возврата malloc в C. Ответ @ Sinan дополнительно иллюстрирует, почему это отслеживается непоследовательно.

16
ответ дан 8 December 2019 в 02:35
поделиться
6
ответ дан 8 December 2019 в 02:35
поделиться

Поскольку malloc возвращает указатель на void, то есть просто выделяет фрагменты памяти без учета данных, которые будут там храниться. В C ++ возвращаемый void * не будет неявно приведен к указателю вашего типа. В вашем примере вы не использовали то, что вернул malloc. Malloc вернул void *, который был неявно преобразован в char *, но в следующей строке вы ... хорошо, это больше не имеет особого смысла.

6
ответ дан 8 December 2019 в 02:35
поделиться

Это одна из немногих проблем, из-за которых утверждение «C ++ - это надмножество C» не совсем верно. В C указатель void может быть неявно приведен к любому другому типу указателя. Однако C ++ немного строже в отношении безопасности типов, поэтому вам нужно явно привести возвращаемое значение malloc к соответствующему типу. Обычно это не является большой проблемой, потому что код C ++ имеет тенденцию использовать new , а не malloc , что не требует приведения типов.

4
ответ дан 8 December 2019 в 02:35
поделиться

В C преобразование результата из malloc не требуется и не должно выполняться. Это может, например, скрыть ошибку #include , поэтому у вас нет прототипа для malloc в области видимости. Это, в свою очередь, может привести к другим ошибкам и отсутствию переносимости (хотя худшие нарушители в этом отношении теперь в основном устарели).

В C ++ вы должны привести результат malloc, чтобы присвоить ему указатель на любой тип кроме недействительности. Если вам действительно не требуется для написания кода, который может быть скомпилирован как на C, так и на C ++, вам следует вообще избегать использования malloc в C ++ и выделять память с помощью new .

3
ответ дан 8 December 2019 в 02:35
поделиться

Вы обычно видите такой код C от новичков (или программистов на C ++ :-)):

int main() {
    int len = 40;
    char *my_string = (char *) malloc(sizeof(char)*len);
    return 0;
}

Это ненужно и плохо, вы можете избежать бесполезного преобразования, включив stdlib.h

#include <stdlib.h>
int main() {
    int len = 40;
    char *my_string = malloc(sizeof(char)*len);
    return 0;
}
1
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: