在if出错的情况下赋值



我用这行代码动态地为一个结构体分配内存:

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 */
}

==优先级高于=

所以首先计算==(导致01),并将其分配给您的指针。

关于这一行:

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 );
}

最新更新