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