Почему нам нужно привести то, что возвращает malloc?

StackOverflow https://stackoverflow.com/questions/1634153

  •  06-07-2019
  •  | 
  •  

Вопрос

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Вы склонны видеть этот вид кода 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top