2016-12-03 138 views
2

比方说,我有这样的代码在if语句中,如果我为变量赋值,是否必须在else语句中再次执行?

if ((p = malloc(int)) == null) { do something } 

else { do something else with p } 

我知道语法可能是不正确的,但如果让说,里面的if语句的条件是不正确的,不等于空,我们移动到else语句,如果我试图在else语句中使用pp仍将被分配malloc(int)?或者我必须在else语句中再次分配malloc(int)p

+1

“意志p仍然被分配的malloc” - 它没有被分配malloc'的'结果*现在*不管。如果您*不想泄漏内存,语法只是不正确。你的任务应该包含在parens中。解决这个问题,'else'块应该有一个非空'p',导致'if'测试失败。 – WhozCraig

+0

你可以用简单的赋值来测试这个假设,而不是用一个可能指向有效内存的指针搞乱UB。不,你不必在'else'块中重复赋值。 – Beta

回答

2

的逻辑是以下

if ((p = malloc(sizeof(int))) == NULL) 
{ 
    // Here p is equal to NULL 
    // skip the else statement 
} else { 
    // Jump here if the allocation was successful and p is not equal to NULL 
} 

因此,如果你将正确使用括号,然后在第一个分配

p = malloc(sizeof(int)) 

检查条件之前被评估。

+0

我有一个快速跟进问题。可以说我有在C 结构的东西{ \t的INT A下面的结构; \t int B; }; 如果我决定使用malloc为它分配空间,并将空间分配给int * p。分配的空间是否包含一个结构事物,我可以使用p-> A或p-> B来访问其参数A和B?或者它只是一个内存空间,我存储一个结构? –

+0

@JohnGringus你可以定义一个结构的对象,就像struct thing t;并访问像t.A和t.B这样的数据成员。或者你可以动态地分配一个对象,比如struct thing * t = malloc(sizeof(struct thing));并访问它的数据成员,如t-> A和t-> B。 –

3

在这个特殊的例子,p是没有得到什么分配你认为它是。等号运算符==的优先级高于赋值运算符=

所以这个:

(p = malloc(int) == null) 

是一样的:

(p = (malloc(int) == null)) 

这意味着p被分配布尔表达式的结果。

你想要的是:

((p = malloc(int)) == null) 

这就赋予的mallocp结果,然后比较反对NULL该值。无论条件是否正确,分配都已完成。因此p包含NULL或指向动态分配内存的指针。