Почему нам нужно привести то, что возвращает malloc? - PullRequest
6 голосов
/ 28 октября 2009
    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

* Я создал структуру с именем String

Ответы [ 7 ]

16 голосов
/ 28 октября 2009

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

6 голосов
/ 28 октября 2009
6 голосов
/ 28 октября 2009

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

4 голосов
/ 28 октября 2009

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

3 голосов
/ 28 октября 2009

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

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

1 голос
/ 28 октября 2009

Вы склонны видеть этот вид кода 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;
}
0 голосов
/ 25 октября 2015

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

...