我用这行代码动态地为一个结构体分配内存:
if (DrinkMachine = (Drink_Machine*)malloc(sizeof(DrinkMachine) * size) == NULL)
return(NULL);
我也试过了:
if (DrinkMachine = (Drink_Machine*)malloc(sizeof(DrinkMachine[size])) == NULL)
return(NULL);
现在,由于我的代码中的错误(某处),它无法动态分配内存,指针确实是NULL。但是,它不会返回NULL,也不会尝试输入if语句,即使它应该为真。到底发生了什么事?
编辑:附加信息。当我通过调试器时,我的结构中的每个项目在手表中显示"无法读取内存"。不知道这是否对任何人都有帮助,但我想我应该把它添加到问题中。
Edit2:所以这是回答,我只是想让它在编辑中可见。
if ((DrinkMachine = (Drink_Machine*)malloc(sizeof(Drink_Machine) * size)) == NULL)
return NULL;
这是正确的输入方式。注意,我还编辑了代码,以便在sizeof()中正确显示Drink_Machine。不包括那个是一个错别字。其他人则表示,显然,单独声明代码然后在下一条语句中测试指针是更明智的。(改正一个错字)
感谢每个花时间回答这个问题的人!
需要将赋值用圆括号括起来,以强制优先。
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 );
}