Задание в условии если пойдет не так


Я динамически выделяю память для структуры с помощью этой строки кода:

if (DrinkMachine = (Drink_Machine*)malloc(sizeof(DrinkMachine) * size) == NULL)
    return(NULL);

Я тоже пробовал:

if (DrinkMachine = (Drink_Machine*)malloc(sizeof(DrinkMachine[size])) == NULL)
    return(NULL);

Теперь из-за ошибки в моем коде (где-то) он не может динамически выделить память, и указатель действительно равен нулю. Однако он не возвращает NULL и не пытается ввести оператор if, даже если он должен быть истинным. Что это дает?

Правка: Дополнительная Информация. Каждый элемент в моей структуре показывает "неспособность читать память" в часах, когда я пройдите через отладчик. Не знаю, поможет ли это кому-нибудь, но я решил добавить это к вопросу.

Edit2: так что это был ответ, я просто хотел сделать его видимым в редактировании.

if ((DrinkMachine = (Drink_Machine*)malloc(sizeof(Drink_Machine) * size)) == NULL)
    return NULL;

Это правильный способ ввести это. Обратите внимание, я отредактировал код, чтобы правильно показать Drink_Machine в значение sizeof(). Не считая того, что это была опечатка. Другие утверждают, что, по-видимому, разумнее просто объявить код отдельно, а затем проверить указатель в следующем операторе. (и одна опечатка исправлено)

Спасибо всем, кто нашел время ответить на этот вопрос!
3 2

3 ответа:

Вам нужно заключить задание в скобки, чтобы принудительно установить приоритет.

if((DrinkMachine = (Drink_Machine *)malloc(sizeof(Drink_Machine) * size)) == NULL) {
    /* DrinkMachine is NULL */
}

== имеет более высокий приоритет , чем =.

Поэтому == вычисляется первым (в результате чего получается 0 или 1), и это присваивается вашему указателю.

Относительно этой строки:

if (DrinkMachine = (Drink_Machine*)malloc(sizeof(DrinkMachine) * size) == NULL)
return(NULL);

1) не приведите возвращаемое значение из любой функции выделения памяти кучи (malloc, calloc, realloc)

2) переменная DrinkMachine должна быть указателем. таким образом, выражение: sizeof(DrinkMachine) вернет размер указателя, а не размер Drink_Machine. 3) синтаксис также неверен. это должно быть:
if ( (DrinkMachine = malloc(sizeof(*DrinkMachine) * size) ) == NULL)
return(NULL);
4) Когда системная функция возвращает признак ошибки, за распознаванием этой ошибки следует: (в этом случае дело)
{
    perror( "malloc for DrinkMachine failed" );
    // the code has failed, so cleanup and exit
    cleanup();
    exit( EXIT_FAILURE );
}