在出错的情况下分配

时间:2016-10-09 23:09:48

标签: c pointers malloc

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

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语句,即使它应该为true。是什么给了什么?

编辑:附加信息。我的结构中的每个项目显示"无法读取内存"在手表中,当我单步执行调试器时。不知道这对任何人都有帮助,但我想我会把它添加到问题中。

Edit2:所以这回答了我只是想在编辑中看到它。

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

这是输入此内容的正确方法。注意,我还编辑了代码以在sizeof()中正确显示Drink_Machine。不包括那是一个错字。其他人已经表示,显然,单独声明代码然后在下一个语句中测试指针会更聪明。 (并修正了一个错字)

感谢所有花时间回答这个问题的人!

3 个答案:

答案 0 :(得分:3)

您需要将赋值括在括号中以强制优先。

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

答案 1 :(得分:2)

==higher precedence而不是=

因此首先计算==(生成01)并将其分配给指针。

答案 2 :(得分:0)

关于这一行:

package pkg;

import org.rosuda.JRI.*;

public class Temp {

    public static void main(String args[]) {

        // Start Rengine.
        Rengine r = new Rengine(new String[] { "--no-save" }, false, null);

        if (!r.waitForR()) {
            System.out.println("Cannot load R");
            return;
        }

        r.eval("source(\'foo.R\')");
        r.eval("a = foo(\"hi\")");

        REXP a = r.eval("a");

        System.out.println(a.toString());

    }
}

1)不要从任何堆内存分配函数(malloc,calloc,realloc)转换返回的值

2)变量if (DrinkMachine = (Drink_Machine*)malloc(sizeof(DrinkMachine) * size) == NULL) return(NULL); 必须是指针。所以表达式:DrinkMachine将返回不是sizeof(DrinkMachine)大小的指针大小。

3)语法也不正确。它应该是:

Drink_Machine

4)当系统函数返回错误指示时,应该遵循该错误的识别:(在这种情况下)

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